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

Javascript 如果responseType为arraybuffer,如何从$http读取JSON错误响应,javascript,angularjs,angular-http,Javascript,Angularjs,Angular Http,我使用 $http.post(url, data, { responseType: "arraybuffer" }).success( function (data) { /* */ }); 如果出现错误,服务器将使用错误JSON对象进行响应,如 { "message" : "something went wrong!" } 是否有任何方法可以获得与成功响应不同类型的错误响应 $http.post(url, data, { responseType: "arrayb

我使用

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

编辑:正如@Paul LeBeau指出的,我的回答假设响应是ASCII编码的

基本上,您只需要将ArrayBuffer解码为字符串并使用JSON.parse()


我在IE11和Chrome中运行了测试,效果很好。

@smkanadl的回答假设响应是ASCII。如果您的响应是另一种编码,那么这将不起作用

现代浏览器(如FF和Chrome,但还不支持IE)现在支持
文本解码器
界面,允许您从
数组缓冲区
解码字符串(通过
数据视图


假设在你的服务中,你有一个你正在使用的函数,比如,这是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。
希望它能对任何有此问题的人有所帮助

您可以从服务器返回您想要的任何错误代码/消息。“出了点问题”看起来像是一个
500
。因此,在服务器端代码中,一旦发现错误,不要返回带有错误消息的
200
。对于服务器错误为
5xx
,对于客户端错误为
4xx
@dcodesmith,状态代码为!==我想知道出了什么问题。因此,我需要从响应中读取错误消息。@dcodesmith状态代码对这个问题不重要。问题是如何读取也是arraybuffer的错误响应。绝对正确。我当时尝试了你的解决方案,发现它在IE中不起作用,这是必需的。这给了我位置处的JSON中的
意外标记N
你看过解码的JSON字符串了吗?可能您的API根本没有正确的JSON响应?看起来我的问题在将其转换为类似以下内容后得到了解决:
…apply(null,新的Uint8Array(数据)作为任何内容)
(我使用的是TypeScript)
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);
}
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());    
}