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

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

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

  1. $http.post(url, data, { responseType: "arraybuffer" }).success(
  2. function (data) { /* */ });

如果出现错误,服务器将以如下错误JSON对象进行响应

  1. { "message" : "something went wrong!" }

有没有办法获得与成功响应不同类型的错误响应?

  1. $http.post(url, data, { responseType: "arraybuffer" })
  2. .success(function (data) { /* */ })
  3. .error(function (data) { /* how to access data.message ??? */ })
cnjp1d6j

cnjp1d6j1#

编辑:正如@Paul LeBeau指出的,我的回答假设响应是ASCII编码的。
基本上,您只需要将ArrayBuffer解码为一个字符串,然后使用JSON.parse()。

  1. var decodedString = String.fromCharCode.apply(null, new Uint8Array(data));
  2. var obj = JSON.parse(decodedString);
  3. var message = obj['message'];

我在IE11和Chrome中运行了测试,这一切都很好。

ar7v8xwq

ar7v8xwq2#

@smkanadl的回答假设响应是ASCII码,如果你的响应是其他编码,那就不起作用。
现代浏览器(例如FF和Chrome,但还不支持IE)现在支持TextDecoder接口,该接口允许您解码来自ArrayBuffer的字符串(通过DataView)。

  1. if ('TextDecoder' in window) {
  2. // Decode as UTF-8
  3. var dataView = new DataView(data);
  4. var decoder = new TextDecoder('utf8');
  5. var response = JSON.parse(decoder.decode(dataView));
  6. } else {
  7. // Fallback decode as ASCII
  8. var decodedString = String.fromCharCode.apply(null, new Uint8Array(data));
  9. var response = JSON.parse(decodedString);
  10. }
bqjvbblv

bqjvbblv3#

假设在您的服务中,有一个要使用的函数,例如,This is for Angular 2

  1. someFunc (params) {
  2. let url = 'YOUR API LINK';
  3. let headers = new Headers();
  4. headers.append('Content-Type', 'application/json');
  5. headers.append('Authorization','Bearer******');
  6. return this._http
  7. .post(url, JSON.stringify(body), { headers: headers})
  8. .map(res => res.json());
  9. }

请确保返回时是res.json()而不是res.json。希望对任何有此问题的人有所帮助

相关问题