Как прочитать ответ на ошибку JSON из $http, если responseType-arraybuffer

я загружаю некоторые двоичные данные, используя

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

в случае ошибки сервер отвечает объектом JSON с ошибкой, например

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

есть ли способ получить ответ на ошибку в другом типе, чем ответ на успех?

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

3 ответов


Edit: как указывает @Paul LeBeau, мой ответ предполагает, что ответ кодируется ASCII.

в основном вам просто нужно декодировать ArrayBuffer в строку и использовать JSON.разбор.)(

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

я запускал тесты в IE11 & Chrome, и это работает просто отлично.


@smkanadl's ответ предполагает, что ответ ASCII. Если ваш ответ в другой кодировке, то это не сработает.

современные браузеры (например. FF и Chrome, но еще не IE) теперь поддерживают TextDecoder интерфейс, который позволяет декодировать строку с ArrayBuffer (через 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);
}

предположим, что в вашем сервисе у вас есть функция, которую вы используете, например, это для 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());    
}

убедитесь, что когда вы возвращаете его, это res.json (), а не res.json. Надеюсь, это поможет, всем, кто имеет эту проблему