私はいくつかのバイナリデータをロードします
$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());
}
返すときに、res.jsonではなくres.json()であることを確認してください。この問題を抱えている人に役立つことを願っています