2016-02-01 7 views
8

Ich mache einen http.patch-Aufruf an eine REST-API, die erfolgreich ist (Status 200), aber nicht alle Antwort-Header-Schlüssel/Werte werden zurückgegeben. Ich interessiere mich für den ETag Schlüssel/Wert.Angular2 HTTP-Antwort fehlender Kopfzeilenschlüssel/Werte

ist hier ein Code-Schnipsel:

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

Wenn es mit einem REST-Client (Postman) den gleichen Anruf tätigt, der Response-Header enthält:

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 

ist der fehlende Antwort-Header Schlüssel/Wert ein Käfer? Kann das Problem mit der Konfiguration gelöst werden?

Antwort

5

Dies ist kein Winkelproblem, eher ein CORS-Problem. Per Definition gibt CORS nur sechs "einfache" Header zurück: Cache-Control, Content-Sprache, Content-Type, Expires, Last-Modified und Pragma.

Aus diesem Grund sehen Sie den vollständigen Satz, wenn Sie einen REST-Client wie Postman verwenden. Wenn Sie jedoch von Ihrem Angular-Client anrufen, sehen Sie nur das von CORS begrenzte Set.

Um dies zu lösen, müssen Sie einen Access-Control-Expose-Headers Header entlang der folgenden Zeilen hinzufügen:

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

Beachten Sie, dass Sie benötigen die Server-Seite Code erweitern die erforderlichen ausgesetzt Header zu unterstützen.

In meinem Fall (C#) überarbeitete ich den Aufruf EnableCors (in WebApiConfig), um "ETAG" in die Liste der freigelegten Kopfzeilen (der vierte Parameter der EnableCorsAttribute-Funktion) aufzunehmen.

+0

Ich habe ein ähnliches Problem, außer, wenn ich auf der Registerkarte Netzwerk in meinem Browser Debugger sehe, kann ich deutlich sehen, die Etag Header und seinen Wert in der HTTP - Antwort auf die API - Anruf ich gemacht, aber wenn ich die drucken Response-Header zur Konsole werden nur 5 im Array angezeigt. Erhält der Browser ALLE Header und dann Winkelfilter, welche sind verfügbar oder so? ... weil ich versucht habe, 'ETag header zu erlaubten headern in cors-einstellungen in meinem Spring boot api hinzuzufügen, aber es hilft nicht.' – gezinspace

+0

Ich denke, das wäre wahrscheinlich als separate Frage besser, aber haben Sie "Access-Control-Expose-Header": "Etag" an die Anfrage Header angehängt? –

+0

Ah, Entschuldigung, ich werde das für zukünftige Fragen berücksichtigen. Ja, nachdem ich diesen Vorschlag in einer anderen Frage gesehen habe, habe ich das zu meinen Anfrageköpfen in eckig hinzugefügt. Ich habe dann einen weiteren Fehler bekommen, der etwas in der Art sagt, dass ich diesen Header nicht verwenden darf. Ich vermutete, dass dies bedeutet, dass ich es zu erlaubten Headern in der CORS-Konfiguration in Spring Boot Server App hinzufügen musste, aber das ist es anscheinend nicht. – gezinspace