HTTP
リクエストをトリガーし、それから有効な応答を取得しています。応答には、読み取りたいヘッダーX-Tokenもあります。私はヘッダーを読み取るために以下のコードを試していますが、結果としてnullを取得します
this.currentlyExecuting.request = this.http.request(reqParams.type, reqParams.url, {
body: reqParams.body,
responseType: 'json',
observe: 'response'
}).subscribe(
(_response: any) => {
// Also tried _response.headers.init();
const header = _response.headers.get('X-Token');
console.log(header);
onComplete(_response.body);
},
_error => {
onComplete({
code: -1,
message: Constants.WEBSERVICE_INTERNET_NOT_CONNNECTED
});
}
);
API
の応答は、Chrome検査でチェックインすると、ヘッダーが存在することを示します。 StackOverflowに関するいくつかの関連する質問を見てみましたが、何も助けませんでした。
サーバー側からxトークンを公開しましたか? 「access-control-expose-headers」を使用します。すべてのヘッダーにクライアント側からアクセスできるわけではないため、サーバー側からヘッダーを公開する必要があります
フロントエンドでも、新しい HTTP モジュールを使用して、{observe: 'response'}
のように完全な応答を取得できます。
http
.get<any>('url', {observe: 'response'})
.subscribe(resp => {
console.log(resp.headers.get('X-Token'));
});
新しいHttpClient
を使用する必要があります。 詳細についてはこちらをご覧ください.
http
.get<any>('url', {observe: 'response'})
.subscribe(resp => {
console.log(resp.headers.get('X-Token'));
});
Hrishikesh Kaleが説明したように、Access-Control-Expose-Headersを渡す必要があります。
ここで、WebAPI/MVC環境でどのように実行できるか
protected void Application_BeginRequest()
{
if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
{
//These headers are handling the "pre-flight" OPTIONS call sent by the browser
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "TestHeaderToExpose");
HttpContext.Current.Response.End();
}
}
別の方法として、webApiconfig.csファイルに以下のコードを追加できます。
config.EnableCors(new EnableCorsAttribute("", headers: "", methods: "*",exposedHeaders: "TestHeaderToExpose") { SupportsCredentials = true });
**以下のようにweb.configファイルにカスタムヘッダーを追加できます。 *
<httpProtocol>
<customHeaders>
<add name="Access-Control-Expose-Headers" value="TestHeaderToExpose" />
</customHeaders>
</httpProtocol>
属性を作成し、その属性を使用してメソッドをデコアできます。
ハッピーコーディング!!
私の場合、POST
応答では、authorization header
が含まれていたため、JWT Token
が必要です。したがって、 this postから読み取ったものは、バックエンドからExpose Header
として追加する必要があるヘッダーです。したがって、私がしたことは、Authorization
ヘッダーをExposed Headerにfilter class
のように追加したことです。
response.addHeader("Access-Control-Expose-Headers", "Authorization");
response.addHeader("Access-Control-Allow-Headers", "Authorization, X-PINGOTHER, Origin, X-Requested-With, Content-Type, Accept, X-Custom-header");
response.addHeader(HEADER_STRING, TOKEN_PREFIX + token); // HEADER_STRING == Authorization
そして、私のAngular側で
コンポーネント内。
this.authenticationService.login(this.f.email.value, this.f.password.value)
.pipe(first())
.subscribe(
(data: HttpResponse<any>) => {
console.log(data.headers.get('authorization'));
},
error => {
this.loading = false;
});
私のサービス側で。
return this.http.post<any>(Constants.BASE_URL + 'login', {username: username, password: password},
{observe: 'response' as 'body'})
.pipe(map(user => {
return user;
}));
次の方法で、応答後のヘッダーからデータを取得できます(Angular 6):
import { HttpClient, HttpHeaders, HttpResponse } from '@angular/common/http';
const httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
observe: 'response' as 'response'
};
this.http.post(link,body,httpOptions).subscribe((res: HttpResponse<any>) => {
console.log(res.headers.get('token-key-name'));
})
以下のコードを使用してヘッダーを取得できます
let main_headers = {}
this.http.post(url,
{email: this.username, password: this.password},
{'headers' : new HttpHeaders ({'Content-Type' : 'application/json'}), 'responseType': 'text', observe:'response'})
.subscribe(response => {
const keys = response.headers.keys();
let headers = keys.map(key => {
`${key}: ${response.headers.get(key)}`
main_headers[key] = response.headers.get(key)
}
);
});
後で、jsonオブジェクトから必要なヘッダーを取得できます。
header_list['X-Token']