Angular2 Http Response отсутствует ключ/значение заголовка

Я делаю вызов http.patch для REST API, который является успешным (состояние 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

Является ли отсутствующий ключ/значение заголовка ответа ошибкой? Можно ли решить проблему с настройкой?


person altab    schedule 01.02.2016    source источник


Ответы (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).

person Steve S    schedule 18.05.2016
comment
У меня аналогичная проблема, за исключением того, что если я посмотрю на вкладку «Сеть» в отладчике моего браузера, я ясно увижу заголовок Etag и его значение в ответе http на вызов API, который я сделал, однако, если я распечатаю заголовки ответа на console, в массиве отображается только 5. Браузер получает ВСЕ заголовки, а затем угловые фильтры, какие из них доступны или что-то в этом роде? ... потому что я пытался добавить «заголовок ETag к разрешенным заголовкам в настройках cors в моем API весенней загрузки, но это не помогает». - person apostrophedottilde; 29.05.2017
comment
Я думаю, что это, вероятно, было бы лучше как отдельный вопрос, но добавили ли вы Access-Control-Expose-Headers: etag к заголовкам запросов? - person Steve S; 30.05.2017
comment
Ах, извините, я буду иметь это в виду для будущих вопросов. Да, увидев это предложение в другом вопросе, я добавил это в свои заголовки запросов в angular. Затем я получил еще одну ошибку, говорящую что-то вроде того, что мне не разрешено использовать этот заголовок. Я предположил, что это означает, что мне нужно было добавить его в разрешенные заголовки в конфигурации CORS в приложении весеннего загрузочного сервера, но, видимо, это не так. - person apostrophedottilde; 30.05.2017