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

han*_*aad 42 javascript angularjs angular-http

我使用加载一些二进制数据

$http.post(url, data, { responseType: "arraybuffer" }).success(
            function (data) { /*  */ });
Run Code Online (Sandbox Code Playgroud)

如果出现错误,服务器会响应错误的JSON对象

{ "message" : "something went wrong!" }
Run Code Online (Sandbox Code Playgroud)

有没有办法以不同于成功响应的类型获取错误响应?

$http.post(url, data, { responseType: "arraybuffer" })
  .success(function (data) { /*  */ })
  .error(function (data) { /* how to access data.message ??? */ })
Run Code Online (Sandbox Code Playgroud)

smk*_*adl 57

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

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

var decodedString = String.fromCharCode.apply(null, new Uint8Array(data));
var obj = JSON.parse(decodedString);
var message = obj['message'];
Run Code Online (Sandbox Code Playgroud)

我在IE11和Chrome中运行测试,这很好用.

  • 看起来我的问题在将其转换为类似“....apply(null, new Uint8Array(data) as any)”之后得到了解决(我正在使用 TypeScript) (2认同)

Pau*_*eau 22

@ smkanadl的答案假设响应是ASCII.如果您的响应采用其他编码,那么这将无效.

现代浏览器(例如FF和Chrome,但还没有IE)现在支持TextDecoder允许您从ArrayBuffer(通过a 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);
}
Run Code Online (Sandbox Code Playgroud)