Подтвердить что ты не робот

Как читать ответ 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 ??? */ })
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

@smkanadl отвечает, что ответ 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);
}

Ответ 3

Предположим, что у вас есть функция, которую вы используете, например, для 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. Надеюсь, что это поможет, любому, у кого есть эта проблема.