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

时间:2015-05-05 12:09:34

标签: javascript angularjs angular-http

我使用

加载一些二进制数据
$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 个答案:

答案 0 :(得分:50)

编辑:正如@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& amp; Chrome和这个工作正常。

答案 1 :(得分:18)

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

答案 2 :(得分:1)

假设在您的服务中,您有一个正在使用的功能,这适用于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。 希望对有这个问题的人有帮助