Angular 6 得到响应 headers 与 httpclient 问题
Angular 6 Get response headers with httpclient issue
我正在使用下面的代码尝试从响应中提取值 (ReturnStatus) headers;
Keep-Alive: timeout=5, max=100
ReturnStatus: OK,SO304545
Server: Apache/2.4.29 (Win32) OpenSSL/1.0.2m
代码;
import { Injectable } from '@angular/core';
import { Account } from './model/account';
import { HttpClient } from '@angular/common/http';
import { Observable, throwError } from "rxjs";
import { map, filter, catchError, mergeMap } from 'rxjs/operators';
createOrder(url) : Observable<any> {
return this._http.get(url, {withCredentials: true, observe: 'response'})
.pipe(
map((resp: any) => {
console.log("response", resp);
return resp;
}), catchError( error => {
console.log("createOrder error",error );
alert("Create Order Service returned an error. See server log for mote details");
return throwError("createOrder: " + error)
})
);
}
然而我的console.log只是给;
HttpResponse {headers: HttpHeaders, status: 200, statusText: "OK", url:
"http://localhost/cgi-bin/dug.cgi/wh?Page…
plateLocation=C:%5Ctemp%5Corderimporttemplate.txt", ok: true, …}
我在本网站和其他网站上查看过 Angular 中执行此操作的正确方法,但无济于事?
有人能给我指出正确的方向吗?
非常感谢,
马克.
您需要按照如下所述观察整个响应:
createOrder(url) : Observable<HttpResponse<Object>>{
return this.http.get<HttpResponse<Object>>(this.url, {observe: 'response'}).pipe(
tap(resp => console.log('response', resp))
);
}
现在您可以在 resp 中访问 headers
一个例子
createOrder(url) : Observable<HttpResponse<Object>>{
return this.http.get<HttpResponse<Object>>(this.url, {observe: 'response'}).pipe(
tap(resp => console.log('heaeder', resp.headers.get('ReturnStatus')))
);
}
如果您无法访问您的自定义 header,如上所述,这是因为出于安全原因,默认情况下有一小部分 header 暴露给 javascript。
可能如果您打开开发人员工具并检查您的响应 header,您应该会看到所需的响应。
谁可以选择 header 暴露给 javascript?
公开的 header 由 Web 应用程序选择(因此您的 Web 服务或后端。显然,您的 Web 应用程序可以使用多种语言 and/or 使用多种框架编写。
根据您使用的内容,您可以通过不同的方式实现此目标。
为了让您了解应该做什么,我可以 post 我的 Spring 解决方案。
在 class extending WebSecurityConfigurerAdapter
你应该添加这两个方法:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
// we don't need CSRF because our token is invulnerable
.csrf().disable()
.cors()
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addExposedHeader("Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " +
"Content-Type, Access-Control-Request-Method, Custom-Filter-Header");
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("GET");
config.addAllowedMethod("POST");
config.addAllowedMethod("PUT");
config.addAllowedMethod("DELETE");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
请注意,我已禁用 csrf,因为我使用的是 JWT。
请注意,您应该优化 CorsFilter 规则。
如您所见,我已将 Custom-Filter-Header
添加到此行
config.addExposedHeader("Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " +
"Content-Type, Access-Control-Request-Method, Custom-Filter-Header");
您可以将此 Custom-Filter-Header
替换为您的 ReturnStatus
我正在使用下面的代码尝试从响应中提取值 (ReturnStatus) headers;
Keep-Alive: timeout=5, max=100
ReturnStatus: OK,SO304545
Server: Apache/2.4.29 (Win32) OpenSSL/1.0.2m
代码;
import { Injectable } from '@angular/core';
import { Account } from './model/account';
import { HttpClient } from '@angular/common/http';
import { Observable, throwError } from "rxjs";
import { map, filter, catchError, mergeMap } from 'rxjs/operators';
createOrder(url) : Observable<any> {
return this._http.get(url, {withCredentials: true, observe: 'response'})
.pipe(
map((resp: any) => {
console.log("response", resp);
return resp;
}), catchError( error => {
console.log("createOrder error",error );
alert("Create Order Service returned an error. See server log for mote details");
return throwError("createOrder: " + error)
})
);
}
然而我的console.log只是给;
HttpResponse {headers: HttpHeaders, status: 200, statusText: "OK", url:
"http://localhost/cgi-bin/dug.cgi/wh?Page…
plateLocation=C:%5Ctemp%5Corderimporttemplate.txt", ok: true, …}
我在本网站和其他网站上查看过 Angular 中执行此操作的正确方法,但无济于事? 有人能给我指出正确的方向吗?
非常感谢,
马克.
您需要按照如下所述观察整个响应:
createOrder(url) : Observable<HttpResponse<Object>>{
return this.http.get<HttpResponse<Object>>(this.url, {observe: 'response'}).pipe(
tap(resp => console.log('response', resp))
);
}
现在您可以在 resp 中访问 headers 一个例子
createOrder(url) : Observable<HttpResponse<Object>>{
return this.http.get<HttpResponse<Object>>(this.url, {observe: 'response'}).pipe(
tap(resp => console.log('heaeder', resp.headers.get('ReturnStatus')))
);
}
如果您无法访问您的自定义 header,如上所述,这是因为出于安全原因,默认情况下有一小部分 header 暴露给 javascript。 可能如果您打开开发人员工具并检查您的响应 header,您应该会看到所需的响应。
谁可以选择 header 暴露给 javascript?
公开的 header 由 Web 应用程序选择(因此您的 Web 服务或后端。显然,您的 Web 应用程序可以使用多种语言 and/or 使用多种框架编写。
根据您使用的内容,您可以通过不同的方式实现此目标。
为了让您了解应该做什么,我可以 post 我的 Spring 解决方案。
在 class extending WebSecurityConfigurerAdapter
你应该添加这两个方法:
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity
// we don't need CSRF because our token is invulnerable
.csrf().disable()
.cors()
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addExposedHeader("Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " +
"Content-Type, Access-Control-Request-Method, Custom-Filter-Header");
config.addAllowedHeader("*");
config.addAllowedMethod("OPTIONS");
config.addAllowedMethod("GET");
config.addAllowedMethod("POST");
config.addAllowedMethod("PUT");
config.addAllowedMethod("DELETE");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
请注意,我已禁用 csrf,因为我使用的是 JWT。 请注意,您应该优化 CorsFilter 规则。
如您所见,我已将 Custom-Filter-Header
添加到此行
config.addExposedHeader("Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, " +
"Content-Type, Access-Control-Request-Method, Custom-Filter-Header");
您可以将此 Custom-Filter-Header
替换为您的 ReturnStatus