我使用
加载一些二进制数据$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 ??? */ })
答案 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。 希望对有这个问题的人有帮助