Non sarai in grado di effettuare una chiamata ajax http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
da un file distribuito a a http://run.jsbin.com
causa della politica della stessa origine .
Poiché la pagina di origine (ovvero l' origine ) e l' URL di destinazione si trovano in domini diversi ( run.jsbin.com
e www.ecb.europa.eu
), il codice sta effettivamente tentando di effettuare una richiesta Cross-domain (CORS) , non ordinaria GET
.
In poche parole, la politica della stessa origine afferma che i browser dovrebbero consentire solo le chiamate ajax ai servizi nello stesso dominio della pagina HTML.
Esempio:
Una pagina su http://www.example.com/myPage.html
può richiedere direttamente solo servizi che si trovano in http://www.example.com
, come http://www.example.com/api/myService
. Se il servizio è ospitato in un altro dominio (ad esempio http://www.ok.com/api/myService
), il browser non effettuerà la chiamata direttamente (come ci si aspetterebbe). Invece, proverà a fare una richiesta CORS.
In breve, per eseguire una richiesta (CORS) * su diversi domini, il tuo browser:
- Includerà
Origin
un'intestazione nella richiesta originale (con il dominio della pagina come valore) e la eseguirà come al solito; e poi
- Solo se la risposta del server a tale richiesta contiene le intestazioni adeguate (
Access-Control-Allow-Origin
è una di queste ) che consente la richiesta CORS, la navigazione completerà la chiamata (quasi ** esattamente come sarebbe se la pagina HTML fosse nello stesso dominio).
- Se le intestazioni previste non vengono visualizzate, il browser si arrende semplicemente (come ha fatto a te).
* Quanto sopra descrive i passaggi in una semplice richiesta, come un normale GET
senza intestazioni di fantasia. Se la richiesta non è semplice (come un POST
con application/json
tipo di contenuto), il browser la tratterrà per un momento e, prima di soddisfarla, invierà prima una OPTIONS
richiesta all'URL di destinazione. Come sopra, continuerà solo se la risposta a questa OPTIONS
richiesta contiene le intestazioni CORS. Questa OPTIONS
chiamata è nota come richiesta di verifica preliminare .
** Sto dicendo quasi perché ci sono altre differenze tra le chiamate normali e le chiamate CORS. Un aspetto importante è che alcune intestazioni, anche se presenti nella risposta, non verranno rilevate dal browser se non sono incluseAccess-Control-Expose-Headers
nell'intestazione.
Come sistemarlo?
Era solo un errore di battitura? A volte il codice JavaScript ha solo un errore di battitura nel dominio di destinazione. Hai controllato? Se la pagina è all'indirizzo www.example.com
, effettuerà solo chiamate regolari a www.example.com
! Altri URL, come api.example.com
o anche example.com
o www.example.com:8080
sono considerati domini diversi dal browser! Sì, se la porta è diversa, allora è un dominio diverso!
Aggiungi le intestazioni. Il modo più semplice per abilitare CORS è aggiungere le intestazioni necessarie (as Access-Control-Allow-Origin
) alle risposte del server. (Ogni server / lingua ha un modo per farlo: controlla alcune soluzioni qui .)
Ultima risorsa: se non si dispone dell'accesso lato server al servizio, è anche possibile eseguirne il mirroring (tramite strumenti come i proxy inversi ) e includere tutte le intestazioni necessarie.