web-dev-qa-db-fra.com

Comment lire la réponse d'erreur JSON à partir de $ http si responseType est arraybuffer

Je charge des données binaires en utilisant 

$http.post(url, data, { responseType: "arraybuffer" }).success(
            function (data) { /*  */ });

En cas d'erreur, le serveur répond par un objet d'erreur JSON tel que

{ "message" : "something went wrong!" }

Existe-t-il un moyen d'obtenir une réponse d'erreur d'un type différent de celui d'une réponse de réussite?

$http.post(url, data, { responseType: "arraybuffer" })
  .success(function (data) { /*  */ })
  .error(function (data) { /* how to access data.message ??? */ })
38
hansmaad

Edit: Comme le souligne @Paul LeBeau, ma réponse suppose que la réponse est codée ASCII.

En gros, il vous suffit de décoder le ArrayBuffer en une chaîne et d’utiliser JSON.parse ().

var decodedString = String.fromCharCode.apply(null, new Uint8Array(data));
var obj = JSON.parse(decodedString);
var message = obj['message'];

J'ai exécuté des tests dans IE11 et Chrome et cela fonctionne très bien.

48
smkanadl

La réponse de @ smkanadl suppose que la réponse est ASCII. Si votre réponse est dans un autre encodage, cela ne fonctionnera pas.

Les navigateurs modernes (par exemple, FF et Chrome, mais pas encore IE) supportent désormais l'interface TextDecoder qui vous permet de décoder une chaîne d'une ArrayBuffer (via une 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);
}
17
Paul LeBeau

Supposons que, dans votre service, vous utilisiez une fonction telle que, ceci est pour 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());    
}

Assurez-vous que, lorsque vous le renvoyez, il s'agit de res.json () et non de res.json . J'espère que cela aidera, à quiconque ayant ce problème

1
Adeel Imran