2016-02-01 11 views
8

Tworzę wywołanie http.patch do REST API, które się powiodło (Status 200), ale nie wszystkie klucze/wartości nagłówków odpowiedzi są zwracane. Interesuje mnie klucz/wartość ETag.Angular2 Http Response brakujący klucz/wartości nagłówka

Oto fragment kodu:

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); 
    } 
); 

Dokonując tego samego połączenia z Klientem REST (Listonosz), nagłówek odpowiedzi zawiera:

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 

jest brak kluczowych nagłówka odpowiedzi/wartości błąd? Czy problem można rozwiązać przy użyciu konfiguracji?

Odpowiedz

5

To nie jest kwestia kątowa, a raczej CORS. Z definicji CORS zwraca tylko sześć "prostych" nagłówków: Cache-Control, Content-Language, Content-Type, Expires, Last-Modified i Pragma.

Dlatego właśnie widzisz pełny zestaw, gdy używasz klienta REST, takiego jak Postman, ale dzwoniąc z klienta Angular, zobaczysz tylko zestaw ograniczony przez CORS.

Aby rozwiązać ten problem, musisz dodać Access-Control-Expose-Headers nagłówek wzdłuż następujących linii:

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); 

pamiętać, że może trzeba poszerzyć kodu po stronie serwera do obsługi wymaganych odsłonięte nagłówków.

W moim przypadku (C#) zrewidowałem wywołanie EnableCors (w ramach WebApiConfig), aby dołączyć "ETAG" do listy odsłoniętych nagłówków (czwarty parametr funkcji EnableCorsAttribute).

+0

Mam podobny problem, z tym wyjątkiem, że jeśli patrzę na kartę Network w moim debuggerze przeglądarki, wyraźnie widzę nagłówek Etag i jego wartość w odpowiedzi http na wywołanie api, ale jeśli wydrukuję Nagłówki odpowiedzi na konsolę, ty jesteś tylko 5 wyświetlany w tablicy. Czy przeglądarka otrzymuje WSZYSTKIE nagłówki, a następnie filtry kątowe, które z nich są dostępne czy coś? ... ponieważ próbowałem dodać nagłówek "ETag" do dozwolonych nagłówków w ustawieniach corsa w moim apelu wiosennego uruchamiania, ale to nie pomaga ". – gezinspace

+0

Myślę, że prawdopodobnie byłoby lepiej jako osobne pytanie, ale czy do nagłówków wniosków dołączono nagłówek "Kontrola dostępu-Odsłanianie": "etag"? –

+0

Ah, przepraszam, będę o tym pamiętać w przypadku przyszłych pytań. Tak, po obejrzeniu tej sugestii w innym pytaniu dodałem to do nagłówków moich żądań w kanciastym. Następnie dostałem kolejny błąd mówiący coś w rodzaju im nie wolno używać tego nagłówka. Zakładam, że oznacza to, że muszę dodać go do dozwolonych nagłówków w konfiguracji CORS w aplikacji serwera startowego, ale najwyraźniej nie. – gezinspace