如果 responseType 是 arraybuffer,如何从 $http 读取 JSON 错误响应
How to read JSON error response from $http if responseType is arraybuffer
我使用
加载一些二进制数据
$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 ??? */ })
编辑:正如@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 中测试,这工作得很好。
@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);
}
假设在您的服务中,您有一个正在使用的功能,这是用于 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());
}
确保 return 是 res.json() 而不是 res.json。
希望对遇到此问题的任何人有所帮助
我使用
加载一些二进制数据$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 ??? */ })
编辑:正如@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 中测试,这工作得很好。
@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);
}
假设在您的服务中,您有一个正在使用的功能,这是用于 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());
}
确保 return 是 res.json() 而不是 res.json。 希望对遇到此问题的任何人有所帮助