我正在对成功的REST API进行http.patch调用(状态200),但并未返回所有响应标头键/值。我对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客户端(邮递员)进行相同的呼叫时,响应头包含:
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
缺少的响应标头键/值是否为错误? 可以通过配置来解决问题吗?
答案 0 :(得分:9)
这不是角度问题,而是CORS问题。根据定义,CORS只返回六个“简单”标题: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);
请注意,您可能需要扩充服务器端代码以支持所需的公开标头。
在我的情况下(C#),我修改了EnableCors
调用(在WebApiConfig中)以在暴露的标题列表中包含“ETAG”(EnableCorsAttribute函数的第四个参数)。