2016-01-18 12 views
6

response.headers() sembra analizzare la risposta dell'intestazione errata quando si lavora con CORS.voci-risorsa Le intestazioni dalla risposta incrociata non sono completamente disponibili.

controllo questo fuori:

// REQUEST 
OPTIONS /mohsenin/loans HTTP/1.1 
Host: mohsenin.app 
Connection: keep-alive 
Access-Control-Request-Method: GET 
Origin: http://mclient.app 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36  (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36 
Access-Control-Request-Headers: accept, authorization, crossorigin 
Accept: */* 
Referer: http://mclient.app/ 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8,fa;q=0.6 

// RESPONSE 
HTTP/1.1 200 OK 
Server: nginx/1.9.3 (Ubuntu) 
Content-Type: text/html; charset=UTF-8 
Transfer-Encoding: chunked 
Connection: keep-alive 
Allow: GET,HEAD 
Cache-Control: no-cache, private 
date: Mon, 18 Jan 2016 09:54:44 GMT 
access-control-allow-origin: http://mclient.app 
Vary: Origin 
access-control-allow-credentials: true 
access-control-allow-methods: GET, POST, PUT, DELETE 
access-control-allow-headers: ACCEPT, AUTHORIZATION, CROSSORIGIN 
Content-Encoding: gzip 

Fin qui tutto bene, e questa è la richiesta GET che viene chiamato dopo che le opzioni:

// REQUEST 
GET /mohsenin/loans HTTP/1.1 
Host: mohsenin.app 
Connection: keep-alive 
Accept: application/json, text/plain, */* 
Origin: http://mclient.app 
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36  (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36 
Authorization: Bearer [..OLDTOKEN..] 
crossOrigin: false 
Referer: http://mclient.app/ 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8,fa;q=0.6 

//RESPONSE 
HTTP/1.1 200 OK 
Server: nginx/1.9.3 (Ubuntu) 
Content-Type: application/json 
Transfer-Encoding: chunked 
Connection: keep-alive 
Cache-Control: no-cache 
Date: Mon, 18 Jan 2016 09:54:44 GMT 
Authorization: Bearer [..NEWTOKEN..] 
Access-Control-Allow-Origin: http://mclient.app 
Vary: Origin 
Access-Control-Allow-Credentials: true 

nota: i dati vengono raccolti da Chrome dev utensili.

Il fatto è che quando uso il response.headers() nella promessa .then, restituisce solo questo oggetto:

Object {content-type: "application/json", cache-control: "no-cache", "": ""} 

e non ho altro modo (che io sappia) accedere alle intestazioni di risposta, anche quella di testo non elaborata.

Cosa ho fatto di sbagliato?

risposta

3

Penso che this SO answer spieghi cosa stai vedendo. In questa risposta, citano il HTML5 Rocks CORS page:

Durante una richiesta CORS, il metodo getResponseHeader() può accedere solo semplici intestazioni di risposta. intestazioni di risposta semplici sono definite come segue:

  • Cache-Control
  • Content-Language
  • Content-Type
  • Valida
  • Last-Modified
  • Pragma

Se vuoi che i clienti siano in grado di accedere ad altre intestazioni, devi usare lo Access-Control-Expose-Headers intestazione. Il valore di questa intestazione è un elenco delimitato da virgole di intestazioni di risposta che si desidera esporre al client.

Quindi, se si controlla l'API che si sta chiamando, è possibile esporre ulteriori intestazioni al client impostando l'intestazione Access-Control-Expose-Headers.

+1

Grazie. Ero perso. ora mi sono ritrovato. –