Cargo algunos datos binarios usando
$http.post(url, data, { responseType: "arraybuffer" }).success( function (data) { /* */ });En caso de error, el servidor responde con un objeto JSON de error como
{ "message" : "something went wrong!" }¿Hay alguna forma de obtener la respuesta de error en un tipo diferente a una respuesta de éxito?
$http.post(url, data, { responseType: "arraybuffer" }) .success(function (data) { /* */ }) .error(function (data) { /* how to access data.message ??? */ })Editar: como señala @Paul LeBeau, mi respuesta asume que la respuesta está codificada en ASCII.
Básicamente, solo necesita decodificar el ArrayBuffer en una cadena y usar JSON.parse().
var decodedString = String.fromCharCode.apply(null, new Uint8Array(data)); var obj = JSON.parse(decodedString); var message = obj['message'];Realicé pruebas en IE11 y Chrome y esto funciona bien.
La respuesta de @smkanadl asume que la respuesta es ASCII. Si su respuesta está en otra codificación, eso no funcionará.
Los navegadores modernos (por ejemplo, FF y Chrome, pero aún no IE) ahora admiten la interfaz TextDecoder que le permite decodificar una cadena de un ArrayBuffer (a través de 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); }Supongamos que en su servicio tiene una función que está usando como, Esto es para 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()); }Asegúrese de que cuando lo devuelva sea res.json() y no res.json. Espero que ayude, a cualquiera que tenga este problema.