angular2-http - Angular2 Http 响应缺少 header 键/值

标签 angular2-http

我正在对成功的 REST API(状态 200)进行 http.patch 调用,但并未返回所有响应 header 键/值。我对 ETag 键/值感兴趣。

这是一个代码片段:

let etag:number = 0;
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('If-Match', String(etag));
this.http.patch(
    'http://example.com:9002/api/myresource/',
     JSON.stringify(dto),
     {headers: headers}
)   
.subscribe(
    (response:Response) => {
        let headers:Headers = response.headers;
        let etag:String = headers.get('ETag');
        console.log(etag);
    }
);

使用 REST 客户端( postman )进行相同调用时,响应 header 包含:
Content-Type: application/hal+json;charset=UTF-8
Date: Mon, 01 Feb 2016 05:21:09 GMT
ETag: "1"
Last-Modified: Mon, 01 Feb 2016 05:15:32 GMT
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
X-Application-Context: application:dev:9002

缺少响应 header 键/值是错误吗?
可以通过配置解决问题吗?

最佳答案

这不是 Angular 问题,而是 CORS 问题。根据定义,CORS 将只返回六个“简单” header :Cache-Control、Content-Language、Content-Type、Expires、Last-Modified 和 Pragma。

这就是为什么您在使用 Postman 等 REST 客户端时会看到完整集,而从 Angular 客户端调用时,您只会看到受 CORS 限制的集。

要解决此问题,您需要添加 Access-Control-Expose-Headers标题如下:

let headers = new Headers();
headers.append('Access-Control-Expose-Headers', 'etag');

let options = new RequestOptions({ headers: headers });

return this.http.get(uri, options).map(this.extractData).catch(this.catchError);

请注意,您可能需要扩充服务器端代码以支持所需的公开 header 。

就我而言(C#),我修改了 EnableCors调用(在 WebApiConfig 中)以在公开的 header 列表中包含“ETAG”(EnableCorsAttribute 函数的第四个参数)。

关于angular2-http - Angular2 Http 响应缺少 header 键/值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35124266/

相关文章:

javascript - Angular 2 - 在单个可观察对象上处理多个订阅

angular - 将数组传递到 URLSearchParams,同时使用 get 请求的 http 调用

ajax - angular2 使用 HTTP 发布 XML 类型请求数据

angular - 任何人都经历过 angular2 加载速度慢的情况

excel - 如何使用 Angular2 正确下载 excel 文件

angular - 重新发送请求 Angular 2

javascript - http 绑定(bind)在 Angular2 中实际用途是什么

angular - Rxjs 管道不适用于 Angular 的 Http.get()

Angular:如何知道请求是否已在 HttpClient 中取消