responsetype javascript angularjs angular-http

javascript - Cómo leer la respuesta de error JSON desde $ http si responseType es arraybuffer



responsetype arraybuffer (3)

Cargué 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 al de una respuesta exitosa?

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


Edición: como señala @Paul LeBeau, mi respuesta asume que la respuesta está codificada en ASCII.

Básicamente, solo necesitas 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, entonces eso no funcionará.

Los navegadores modernos (por ejemplo, FF y Chrome, pero no IE aún) ahora admiten la interfaz TextDecoder que le permite decodificar una cadena desde 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); }


Suponga que en su servicio, tiene una función que está utilizando 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 es res.json () y no res.json. Espero que ayude, a cualquiera que tenga este problema