【发布时间】:2020-10-27 07:48:25
【问题描述】:
我正在使用 HttpClient.get() 从 Angular 9 应用程序调用 REST 服务,但没有看到响应标头的完整列表。我知道服务发送它们是因为:
和
- 当我使用 Java 应用程序访问相同的 REST 服务时,它会返回完整的标头,总共大约有十几个:
java.net.http.HttpHeaders@1627d314 { {{access-control-allow-origin=[*], 年龄=[0],连接=[保持活动],内容长度=[1207], 内容类型=[应用程序/json],日期=[格林威治标准时间 2020 年 7 月 7 日星期二 05:11:45] <...>
我从 Angular HttpClient.get() 得到的只是 header.keys() 中的一项:
headers: {
"normalizedNames": {},
"lazyUpdate": null,
"lazyInit": null,
"headers": {}
}
headerKeys:
[
"content-type: application/json"
]
我创建了一个小型示例应用程序来演示该问题。以下是关键组件:
app.modules.ts:
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpClientModule } from '@angular/common/http';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
import { TesterComponent } from './tester/tester.component';
@NgModule({
declarations: [
AppComponent,
TesterComponent
],
imports: [
BrowserModule,
AppRoutingModule,
HttpClientModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
tester.component.ts:
import { Component, OnInit } from '@angular/core';
import { HttpHeaders, HttpParams, HttpResponse, HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
@Component({
selector: 'app-tester',
templateUrl: './tester.component.html',
styleUrls: ['./tester.component.css']
})
export class TesterComponent implements OnInit {
_url: string = "https://api.nasa.gov/planetary/apod";
_api_key: string="DEMO_KEY";
//
_title: string;
_date: string;
constructor(private _httpClient: HttpClient) { }
ngOnInit(): void {
this.GetData(this._url).subscribe(() =>
{
// do other stuff
});
}
sendGetRequest(getUrl: string, headers: HttpHeaders, urlParams: HttpParams) : Observable<HttpResponse<Object>>{
return this._httpClient.get<HttpResponse<Object>>(getUrl, {headers: headers, params: urlParams, observe: 'response'});
}
GetData(url: string)
{
const params = new HttpParams()
.set("api_key", this._api_key);
return this.sendGetRequest(url, headers, params).pipe(
tap( response =>
{
console.log("returning data");
if (response.headers)
{
console.log('headers', response.headers);
}
const keys = response.headers.keys();
if (keys)
{
const headerKeys = keys.map(key =>
`${key}: ${response.headers.get(key)}`);
console.log('headerKeys', headerKeys);
}
this._date = response.body['date'];
this._title = response.body['title'];
},
err => {
console.log(err);
}
));
}
}
附录: 为了进一步说明问题,这里有一个小型 Java 11 程序,它完全使用相同的凭据调用相同的 REST API。您可以从输出中看到 REST API 正在发回所有标头响应信息。问题仍然存在,为什么调用 exactly 相同 REST API 的 Angular 程序看不到完整的响应标头?通话中是否缺少某些设置/标志/巫术?
Java 11 应用程序:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
public class MainClass {
public static void main(String[] args) {
String api_key = "DEMO_KEY";
String uri = "https://api.nasa.gov/planetary/apod";
uri += "?api_key=" + api_key;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder().uri(URI.create(uri)).build();
HttpResponse<String> response = null;
try {
response = client.send(request, BodyHandlers.ofString());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("------------------");
System.out.println("response.headers: " + response.headers());
System.out.println(response.body());
System.out.println("------------------");
}
}
Java 应用程序的输出(response.header 仅为简洁起见):
response.headers: java.net.http.HttpHeaders@96f4f3fc { {access-control-allow-origin=[*], age=[0], connection=[keep-alive], 内容长度=[1302],内容类型=[应用程序/json],日期=[星期三,08 2020 年 7 月 17:13:42 GMT],服务器=[openresty], 严格传输安全=[最大年龄=31536000;预载], 变化=[接受编码],通过=[http/1.1 api-umbrella (ApacheTrafficServer [cMsSf ])], x-cache=[MISS], x-ratelimit-limit=[40], x-ratelimit-remaining=[39]} }
感谢您的帮助!
【问题讨论】:
标签: angular header httpclient response