web-dev-qa-db-ja.com

responseTypeがarraybufferの場合、$ httpから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 ??? */ })
41
hansmaad

編集:@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でテストを実行しましたが、これは正常に機能します。

55
smkanadl

@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);
}
21
Paul LeBeau

あなたのサービスで、あなたが使用しているような関数があるとします、これは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()であることを確認してください。この問題を抱えている人に役立つことを願っています

1
Adeel Imran