angularjs 如果responseType是arraybuffer,如何从$http读取JSON错误响应

b5buobof  于 2022-10-31  发布在  Angular
关注(0)|答案(3)|浏览(298)

我使用以下方法加载一些二进制数据

$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 ??? */ })
cnjp1d6j

cnjp1d6j1#

编辑:正如@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中运行了测试,这一切都很好。

ar7v8xwq

ar7v8xwq2#

@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);
}
bqjvbblv

bqjvbblv3#

假设在您的服务中,有一个要使用的函数,例如,This is for 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。希望对任何有此问题的人有所帮助

相关问题