How to read JSON error response from $http if responseType is arraybuffer
Solution 1
Edit: As @Paul LeBeau points out, my answer assumes that the response is ASCII encoded.
Basically you just need to decode the ArrayBuffer into a string and use JSON.parse().
var decodedString = String.fromCharCode.apply(null, new Uint8Array(data));
var obj = JSON.parse(decodedString);
var message = obj['message'];
I ran tests in IE11 & Chrome and this works just fine.
Solution 2
@smkanadl's answer assumes that the response is ASCII. If your response is in another encoding, then that won't work.
Modern browsers (eg. FF and Chrome, but not IE yet) now support the TextDecoder
interface that allows you to decode a string from an ArrayBuffer
(via a DataView
).
if ('TextDecoder' in window) {
// Decode as UTF-8
var dataView = new DataView(data);
var decoder = new TextDecoder('utf8');
var response = JSON.parse(decoder.decode(dataView));
} else {
// Fallback decode as ASCII
var decodedString = String.fromCharCode.apply(null, new Uint8Array(data));
var response = JSON.parse(decodedString);
}
Solution 3
Suppose in your service, you have a function you are using like, This is for Angular 2
someFunc (params) {
let url = 'YOUR API LINK';
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Authorization','Bearer ******');
return this._http
.post(url, JSON.stringify(body), { headers: headers})
.map(res => res.json());
}
Make sure when you return it it is res.json() and not res.json. Hope it helps, to anyone having this issue
hansmaad
Hannes Kamecke « Engineer « Software Developer « Cologne, Germany hansmaad gmail.com
Updated on February 10, 2020Comments
-
hansmaad over 4 years
I load some binary data using
$http.post(url, data, { responseType: "arraybuffer" }).success( function (data) { /* */ });
In case of an error, the server responds with an error JSON object like
{ "message" : "something went wrong!" }
Is there any way to get the error response in a different type than a success response?
$http.post(url, data, { responseType: "arraybuffer" }) .success(function (data) { /* */ }) .error(function (data) { /* how to access data.message ??? */ })
-
smkanadl over 7 yearsDefinitely right. I tried your solution back then and found out it does not work in IE which was required.
-
Bassie almost 4 yearsThis gives me
Unexpected token N in JSON at position
-
smkanadl almost 4 yearsHave you looked at the decoded JSON string? Probably your API does not answer in proper JSON at all?
-
Bassie almost 4 yearsLooks like my issue got resolved after casting it as any like this
....apply(null, new Uint8Array(data) as any)
(I'm using TypeScript) -
jet_choong almost 2 yearsConfirmed this is working fine.