2015-05-05 11 views
27

passo per caricare alcuni dati binari utilizzando

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

In caso di errore, il server risponde con un oggetto JSON errore come

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

Esiste un modo per ottenere la risposta all'errore in un tipo diverso rispetto a una risposta positiva?

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

È possibile restituire qualsiasi codice di errore/messaggio che si desidera dal server. "Qualcosa è andato storto" sembra un "500". Quindi nel codice server una volta catturato l'errore non si restituisce un '200' con un messaggio di errore. Per errori del server è '5xx' e per gli errori del client è' 4xx' – dcodesmith

+0

@dcodesmith \t Il codice di stato è! == 200.Voglio sapere cosa è andato storto. Pertanto ho bisogno di leggere il messaggio di errore dalla risposta. – hansmaad

+0

@dcodesmith Il codice di stato non ha importanza per questa domanda. La domanda è come leggere la risposta all'errore che è anche un arraybuffer. – hansmaad

risposta

34

Modifica: Come sottolinea @Paul LeBeau, la mia risposta presuppone che la risposta sia codificata ASCII.

Fondamentalmente è sufficiente decodificare ArrayBuffer in una stringa e utilizzare JSON.parse().

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

ho fatto delle prove in IE11 & Chrome e questo funziona bene.

13

La risposta di @ smkanadl presuppone che la risposta sia ASCII. Se la tua risposta è in un'altra codifica, allora non funzionerà.

Browser moderni (ad es. FF e Chrome, ma non IE ancora) ora supportano l'interfaccia TextDecoder che permette di decodificare una stringa da un ArrayBuffer (tramite un 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); 
} 
+2

questa dovrebbe essere la risposta corretta –

+0

Sicuramente giusto. Ho provato la soluzione allora e ho scoperto che non funziona in IE che era necessario. – smkanadl

1

Supponiamo che nel vostro servizio, si dispone di una funzione che si sta utilizzando come, questo è per 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());  
} 

Assicurarsi che quando lo restituite è res.json() e non res. jSON. Spero che sia d'aiuto, per chiunque abbia questo problema

Problemi correlati