【问题标题】:Angular2 Http Response missing header key/valuesAngular2 Http响应缺少标头键/值
【发布时间】:2016-05-09 12:49:24
【问题描述】:

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

这是一个代码sn-p:

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 客户端(邮递员)进行相同调用时,响应标头包含:

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

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

【问题讨论】:

    标签: angular2-http


    【解决方案1】:

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

    这就是为什么您在使用 REST 客户端(如 Postman)时会看到完整的集合,但从 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);
    

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

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

    【讨论】:

    • 我遇到了类似的问题,除了如果我在浏览器调试器中查看“网络”选项卡,我可以清楚地看到 Etag 标头及其在对我进行的 api 调用的 http 响应中的值,但是,如果我将响应标头打印到控制台,则数组中仅显示 5 个。浏览器是否获得所有标题,然后是角度过滤器,哪些是可用的? ...因为我试图在我的 spring boot api 的 cors 设置中添加“ETag 标头到允许的标头,但这没有帮助。”
    • 我认为这作为一个单独的问题可能会更好,但是您是否将“Access-Control-Expose-Headers”:“etag”附加到请求标头?
    • 啊,对不起,我会记住这一点,以备将来的问题。是的,在另一个问题中看到这个建议后,我将它添加到我的请求标头中。然后我得到另一个错误,说我不允许使用该标题。我认为这意味着我需要将它添加到 Spring Boot 服务器应用程序中 CORS 配置中的允许标头中,但显然不是这样。
    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    • 2018-04-25
    • 2019-02-25
    • 2018-07-02
    相关资源
    最近更新 更多