从 API 响应中读取响应 headers - Angular 5 + TypeScript
Read response headers from API response - Angular 5 + TypeScript
我正在触发一个 HTTP
请求并且我从它那里得到了一个有效的响应。响应中还有一个 header X-Token
我希望阅读。我正在尝试使用下面的代码来读取 headers,但是,我得到的结果是 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 检查时显示 header 存在。
您应该使用新的 HttpClient
。 You can find more information here.
http
.get<any>('url', {observe: 'response'})
.subscribe(resp => {
console.log(resp.headers.get('X-Token'));
});
您是否使用 access-control-expose-headers
从服务器端公开了 X-Token
?因为不是所有的headers都允许从客户端访问,你需要从服务器端暴露它们
同样在您的前端,您可以使用新的 HTTP 模块来使用 {observe: 'response'}
获得完整响应,例如
http
.get<any>('url', {observe: 'response'})
.subscribe(resp => {
console.log(resp.headers.get('X-Token'));
});
您可以通过这种方式从 post 响应头中获取数据 (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'));
})
您可以使用以下代码获得 headers
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 object.
中得到所需的 header
header_list['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 文件中添加自定义 headers,如下所示。 *
<httpProtocol>
<customHeaders>
<add name="Access-Control-Expose-Headers" value="TestHeaderToExpose" />
</customHeaders>
</httpProtocol>
我们可以创建一个属性并使用该属性对方法进行装饰。
编码愉快!!
在我的例子中,在 POST
响应中,我想要 authorization header
,因为我在其中包含 JWT Token
。
所以我从 this post 中读到的是我们想要的 header 应该添加为 back-end 中的 Expose Header
。
所以我所做的是将 Authorization
header 添加到我的 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 7
服务:
this.http.post(environment.urlRest + '/my-operation',body, { headers: headers, observe: 'response'});
分量:
this.myService.myfunction().subscribe(
(res: HttpResponse) => {
console.log(res.headers.get('x-token'));
} ,
error =>{
})
试试这个简单的代码。
1.组件端代码: 以获得 body 和 header 属性。 body 中有一个标记,header 中有一个标记 Authorization
。
loginUser() {
this.userService.loginTest(this.loginCred).
subscribe(res => {
let output1 = res;
console.log(output1.body.token);
console.log(output1.headers.get('Authorization'));
})
}
2。服务端代码: 在 body 中发送登录数据并在 Observable
中观察任何在组件端订阅的响应。
loginTest(loginCred: LoginParams): Observable<any> {
const header1= {'Content-Type':'application/json',};
const body = JSON.stringify(loginCred);
return this.http.post<any>(this.baseURL+'signin',body,{
headers: header1,
observe: 'response',
responseType: 'json'
});
}
当从 ASP.NET 核心服务获取 headers 应用程序时,我必须执行以下操作才能使它们出现在 SPA Angular 应用程序中:
var builder = WebApplication.CreateBuilder(args);
services.AddCors(options =>
{
options.AddPolicy("MyExposeResponseHeadersPolicy",
builder =>
{
builder.WithOrigins("https://*.example.com")
.WithExposedHeaders("x-custom-header");
});
});
builder.Services.AddControllers();
var app = builder.Build();
我正在触发一个 HTTP
请求并且我从它那里得到了一个有效的响应。响应中还有一个 header X-Token
我希望阅读。我正在尝试使用下面的代码来读取 headers,但是,我得到的结果是 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 检查时显示 header 存在。
您应该使用新的 HttpClient
。 You can find more information here.
http
.get<any>('url', {observe: 'response'})
.subscribe(resp => {
console.log(resp.headers.get('X-Token'));
});
您是否使用 access-control-expose-headers
从服务器端公开了 X-Token
?因为不是所有的headers都允许从客户端访问,你需要从服务器端暴露它们
同样在您的前端,您可以使用新的 HTTP 模块来使用 {observe: 'response'}
获得完整响应,例如
http
.get<any>('url', {observe: 'response'})
.subscribe(resp => {
console.log(resp.headers.get('X-Token'));
});
您可以通过这种方式从 post 响应头中获取数据 (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'));
})
您可以使用以下代码获得 headers
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 object.
中得到所需的 headerheader_list['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 文件中添加自定义 headers,如下所示。 *
<httpProtocol>
<customHeaders>
<add name="Access-Control-Expose-Headers" value="TestHeaderToExpose" />
</customHeaders>
</httpProtocol>
我们可以创建一个属性并使用该属性对方法进行装饰。
编码愉快!!
在我的例子中,在 POST
响应中,我想要 authorization header
,因为我在其中包含 JWT Token
。
所以我从 this post 中读到的是我们想要的 header 应该添加为 back-end 中的 Expose Header
。
所以我所做的是将 Authorization
header 添加到我的 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 7 服务:
this.http.post(environment.urlRest + '/my-operation',body, { headers: headers, observe: 'response'});分量:
this.myService.myfunction().subscribe( (res: HttpResponse) => { console.log(res.headers.get('x-token')); } , error =>{ })
试试这个简单的代码。
1.组件端代码: 以获得 body 和 header 属性。 body 中有一个标记,header 中有一个标记 Authorization
。
loginUser() {
this.userService.loginTest(this.loginCred).
subscribe(res => {
let output1 = res;
console.log(output1.body.token);
console.log(output1.headers.get('Authorization'));
})
}
2。服务端代码: 在 body 中发送登录数据并在 Observable
中观察任何在组件端订阅的响应。
loginTest(loginCred: LoginParams): Observable<any> {
const header1= {'Content-Type':'application/json',};
const body = JSON.stringify(loginCred);
return this.http.post<any>(this.baseURL+'signin',body,{
headers: header1,
observe: 'response',
responseType: 'json'
});
}
当从 ASP.NET 核心服务获取 headers 应用程序时,我必须执行以下操作才能使它们出现在 SPA Angular 应用程序中:
var builder = WebApplication.CreateBuilder(args);
services.AddCors(options =>
{
options.AddPolicy("MyExposeResponseHeadersPolicy",
builder =>
{
builder.WithOrigins("https://*.example.com")
.WithExposedHeaders("x-custom-header");
});
});
builder.Services.AddControllers();
var app = builder.Build();