Angular 4.3.3 HttpClient : レスポンスのヘッダーから値を取得する方法は?
質問
( エディタ: VS Code; タイプスクリプト: 2.2.1 )
目的は、リクエストのレスポンスのヘッダを取得することです。
サービス内のHttpClientでPOSTリクエストを想定する
import {
Injectable
} from "@angular/core";
import {
HttpClient,
HttpHeaders,
} from "@angular/common/http";
@Injectable()
export class MyHttpClientService {
const url = 'url';
const body = {
body: 'the body'
};
const headers = 'headers made with HttpHeaders';
const options = {
headers: headers,
observe: "response", // to display the full response
responseType: "json"
};
return this.http.post(sessionUrl, body, options)
.subscribe(response => {
console.log(response);
return response;
}, err => {
throw err;
});
}
最初の問題は、Typescriptのエラーが発生することです。
'Argument of type '{
headers: HttpHeaders;
observe: string;
responseType: string;
}' is not assignable to parameter of type'{
headers?: HttpHeaders;
observe?: "body";
params?: HttpParams; reportProgress?: boolean;
respons...'.
Types of property 'observe' are incompatible.
Type 'string' is not assignable to type '"body"'.'
at: '51,49' source: 'ts'
確かに、post()メソッドのrefに行くと、このプロトタイプを指しています(I Use VS code)
post(url: string, body: any | null, options: {
headers?: HttpHeaders;
observe?: 'body';
params?: HttpParams;
reportProgress?: boolean;
responseType: 'arraybuffer';
withCredentials?: boolean;
}): Observable<ArrayBuffer>;
しかし、私はこのオーバーロードされたメソッドが欲しいのです。
post(url: string, body: any | null, options: {
headers?: HttpHeaders;
observe: 'response';
params?: HttpParams;
reportProgress?: boolean;
responseType?: 'json';
withCredentials?: boolean;
}): Observable<HttpResponse<Object>>;
そこで、このエラーを修正するために、このような構造で試してみました。
const options = {
headers: headers,
"observe?": "response",
"responseType?": "json",
};
そして、それはコンパイルされます しかし、私はちょうどjson形式のように本文の要求を取得します。
さらに、なぜフィールドの名前の最後に ?記号を付けなければならないのでしょうか?Typescriptのサイトで見たのですが、このシンボルは、それがオプションであることをユーザーに伝えるだけでよいのでしょうか?
また、すべてのフィールドを、?マークなしと?マークありで使ってみました。
EDIT
で提案された解決策を試してみました。 Angular 4 APIレスポンスからヘッダを取得する . マップソリューションの場合。
this.http.post(url).map(resp => console.log(resp));
Typescript コンパイラは map は Observable の一部ではないので存在しないことを伝えます。
また、次のことも試してみました。
import { Response } from "@angular/http";
this.http.post(url).post((resp: Response) => resp)
コンパイルはできますが、unsupported Media Typeというレスポンスが返ってきます。 これらの解決策は "Http" ではうまくいくはずですが、"HttpClient" ではうまくいきません。
編集 2
私は@Supamiuの解決策でunsupported media typeを得たので、それは私のヘッダのエラーであろう。だから、上記の2番目の解決策(レスポンスタイプ付き)も動作するはずです。しかし、個人的には、"Http" と "HttpClient" を混ぜるのは良い方法だとは思わないので、私はSupamiuのソリューションを維持するつもりです。
どのように解決するのですか?
コンテンツだけでなく、フルレスポンスを観察することができます。これを行うには
observe: response
を
options
を関数呼び出しのパラメータに追加します。
http
.get<MyJsonData>('/data.json', {observe: 'response'})
.subscribe(resp => {
// Here, resp is of type HttpResponse<MyJsonData>.
// You can inspect its headers:
console.log(resp.headers.get('X-Custom-Header'));
// And access the body directly, which is typed as MyJsonData as requested.
console.log(resp.body.someField);
});
関連
-
[解決済み] JavaScriptで現在の日付を取得するには?
-
[解決済み] セレクタの子を取得する方法は?
-
[解決済み】「GET」パラメータから値を取得する(JavaScript)【重複】。
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] WebStormで未解決の変数が大量にある場合の警告に対処する方法は?
-
[解決済み] JavaScriptで:hoverのCSSプロパティを変更する
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] Reactコンポーネントでthis.setStateを複数回使用するとどうなりますか?
-
[解決済み] JavaScriptでjson-objectのキーを取得する [重複].
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] JavaScriptのtoString()関数をオーバーライドして、デバッグ用に意味のある出力を提供することは可能でしょうか?
-
[解決済み] JavaScriptで文字列を数値に変換する最速の方法は何ですか?
-
[解決済み] JavaScriptでjson-objectのキーを取得する [重複].
-
[解決済み] 各オブジェクトに?重複
-
[解決済み] CORS: 認証モードは 'include' です。
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
-
[解決済み] querySelectorAllがない場合、ライブラリを使用せずに属性で要素を取得する?
-
[解決済み] これは純関数ですか?