Как читать ответ 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 ??? */ })
Ответы
Ответ 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.
Надеюсь, что это поможет, любому, у кого есть эта проблема.