8

成功した 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 クライアント (Postman) で同じ呼び出しを行う場合、応答ヘッダーには次のものが含まれます。

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

欠落している応答ヘッダーのキー/値はバグですか? 構成で問題を解決できますか?

4

1 に答える 1

8

これは Angular の問題ではなく、CORS の問題です。定義上、CORS は、Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma の 6 つの「単純な」ヘッダーのみを返します。

そのため、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 内の) 呼び出しを修正して、公開されたヘッダーのリスト (EnableCorsAttribute 関数の 4 番目のパラメーター) に「ETAG」を含めました。

于 2016-05-18T17:57:53.943 に答える