【问题标题】:How to read JSON error response from $http if responseType is arraybuffer如果 responseType 是 arraybuffer,如何从 $http 读取 JSON 错误响应
【发布时间】:2015-05-05 12:09:33
【问题描述】:

我使用

加载一些二进制数据
$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 ??? */ })

【问题讨论】:

  • 您可以从服务器返回您想要的任何错误代码/消息。 “出了点问题”似乎是500。因此,在服务器端代码中,一旦您发现错误,就不要返回带有错误消息的200。服务器错误为5xx,客户端错误为4xx
  • @dcodesmith 状态码是 !== 200。我想知道出了什么问题。因此我需要从响应中读取错误消息。
  • @dcodesmith 状态码与这个问题无关。问题是如何读取也是数组缓冲区的错误响应。

标签: javascript angularjs angular-http


【解决方案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 中运行测试,效果很好。

【讨论】:

  • 这给了我Unexpected token N in JSON at position
  • 你看过解码的 JSON 字符串了吗?可能您的 API 根本没有以正确的 JSON 格式回答?
  • 看起来我的问题在像这样....apply(null, new Uint8Array(data) as any)(我正在使用 TypeScript)之后得到了解决
【解决方案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);
}

【讨论】:

  • 绝对正确。我当时尝试了您的解决方案,发现它在所需的 IE 中不起作用。
【解决方案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。 希望对遇到此问题的人有所帮助

【讨论】:

    猜你喜欢
    • 2019-01-18
    • 2016-07-03
    • 2019-10-10
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多