web-dev-qa-db-ja.com

Angular 2 HTTPレスポンスボディを文字列またはJSONに変換せずにアクセスするにはどうすればよいですか?

REST応答をblobにコピーしたいのですが、応答オブジェクトにblob()arrayBuffer()がまだ実装されていないため、一部を実行できません。 。応答本文はプライベート変数です。

...
return this.http.get(url, {params: params, headers: headers})
     .map(res => {   
        // can't access _body because it is private
        // no method appears to exist to get to the _body without modification             
        new Blob([res._body], {type: res.headers.get('Content-Type')});
     })
     .catch(this.log);
...

これらのメソッドが実装されるまで使用できるソリューションはありますか?

23
sschueller

文字列として本文にアクセスするためのはるかに簡単なソリューションがありますが、これはどこにも文書化されていません。

let body = res.text()
48
StudioLE

@StudioLEへのアドオン。 json()メソッドを使用して、データをjsonとして返すことができます。

let body = res.json()
10
SKL

同じ問題に遭遇したときにこの質問を見つけたので(そして、Angularのドキュメントは今日現在更新されていません)、次を使用できます:

let blob = new Blob([response.arrayBuffer()], { type: contentType });

何らかの理由でAngular 2の古いバージョンを使用している場合の別の回避策は次のとおりです。

let blob = new Blob([(<any> response)._body], { type: contentType });
6
dmungin

requestoptionsのresponseTypeを設定します。これにより、response.blob()メソッドが機能します。

let headers = this.getAuthorizationHeader();
headers.append("Accept", "application/octet-stream");
return this.http
    .get(url, new RequestOptions({ headers: headers, responseType: ResponseContentType.Blob }))
    .map((res: Response): Blob => {
        return res.ok ? res.blob() : undefined;
    });
2
Andreas

次のPRがマージされるまで、他のソリューションは見当たりません。

コンパイルエラーが発生するのに対して、実行時にフィールドを使用できます...

1