2016-02-01 21 views
8

Sto effettuando una chiamata http.patch a un'API REST che ha esito positivo (stato 200) ma non tutte le intestazioni/chiavi di risposta vengono restituite. Sono interessato alla chiave/valore ETag.Angular2 Http Response mancante chiave/valori dell'intestazione

Ecco un frammento di codice:

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

Quando si effettua la stessa chiamata con un client REST (postino), l'intestazione di risposta contiene:

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 

è la chiave intestazione di risposta/valori mancanti un insetto? Il problema può essere risolto con la configurazione?

risposta

5

Questo non è un problema angolare, piuttosto uno CORS. Per definizione, CORS restituirà solo sei intestazioni "semplici": Cache-Control, Content-Language, Content-Type, Expires, Last-Modified e Pragma.

Ecco perché si vede il set completo quando si utilizza un client REST come Postman, eppure quando si chiama dal proprio client Angolare, si vedrà solo il set limitato da CORS.

Per risolvere questo problema, è necessario aggiungere un'intestazione Access-Control-Expose-Headers secondo le seguenti linee:

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

Nota che potrebbe essere necessario per aumentare il codice lato server per supportare le intestazioni esposti richiesti.

Nel mio caso (C#), ho modificato la chiamata EnableCors (all'interno di WebApiConfig) per includere "ETAG" nell'elenco di intestazioni esposte (il quarto parametro della funzione EnableCorsAttribute).

+0

Sto avendo un problema simile, tranne che se guardo nella scheda Rete nel mio debugger del browser, posso chiaramente vedere l'intestazione Etag nd il suo valore nella risposta http alla chiamata api che ho fatto, tuttavia se stampo il le intestazioni di risposta alla console, sono solo 5 visualizzate nella matrice. Il browser ottiene TUTTE le intestazioni e quindi i filtri angolari quali sono disponibili o qualcosa del genere? ... perché ho provato ad aggiungere l'intestazione ETag alle intestazioni consentite nelle impostazioni cors nel mio spring boot api, ma non aiuta. – gezinspace

+0

Penso che probabilmente sarebbe meglio come una domanda separata, ma hai aggiunto "Access-Control-Expose-Headers": "etag" alle intestazioni delle richieste? –

+0

Ah, mi dispiace, lo terrò a mente per domande future. Sì, dopo aver visto questo suggerimento in un'altra domanda ho aggiunto questo alle intestazioni della mia richiesta in modo angolare. Poi ho ricevuto un altro errore che diceva qualcosa sulla falsariga di im non permesso di usare quell'intestazione. Presumevo che ciò significasse che dovevo aggiungerlo alle intestazioni consentite nella configurazione di CORS nell'app di boot server di primavera, ma a quanto pare non è così. – gezinspace