Vous ne pourrez pas passer un appel ajax à http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
partir d'un fichier déployé à en http://run.jsbin.com
raison de la politique de même origine .
Comme la page source (aka origine ) et l' URL cible se trouvent dans des domaines différents ( run.jsbin.com
et www.ecb.europa.eu
), votre code tente en fait de faire une requête interdomaine (CORS) , pas une requête ordinaire GET
.
En quelques mots, la politique de même origine stipule que les navigateurs ne doivent autoriser que les appels ajax aux services du même domaine de la page HTML.
Exemple:
Une page sur http://www.example.com/myPage.html
peut uniquement demander directement les services qui sont à http://www.example.com
, comme http://www.example.com/api/myService
. Si le service est hébergé sur un autre domaine (par exemple http://www.ok.com/api/myService
), le navigateur n'effectuera pas l'appel directement (comme vous vous en doutez). Au lieu de cela, il essaiera de faire une requête CORS.
En bref, pour effectuer une requête (CORS) * sur différents domaines, votre navigateur:
- Inclura un en-
Origin
tête dans la demande d'origine (avec le domaine de la page comme valeur) et l'exécutera comme d'habitude; puis
- Ce n'est que si la réponse du serveur à cette requête contient les en- têtes adéquats (
Access-Control-Allow-Origin
est l' un d'entre eux ) permettant la requête CORS, la navigation terminera l'appel (presque ** exactement comme il le ferait si la page HTML était dans le même domaine).
- Si les en-têtes attendus ne viennent pas, le navigateur abandonne simplement (comme il l'a fait pour vous).
* Ce qui précède décrit les étapes dans une requête simple , comme une requête régulière GET
sans en-têtes sophistiqués. Si la demande n'est pas simple (comme un POST
avec application/json
comme type de contenu), le navigateur la retiendra un moment et, avant de la remplir, enverra d'abord une OPTIONS
demande à l'URL cible. Comme ci-dessus, il ne continuera que si la réponse à cette OPTIONS
requête contient les en-têtes CORS. Cet OPTIONS
appel est appelé demande de contrôle en amont .
** Je dis presque parce qu'il existe d'autres différences entre les appels réguliers et les appels CORS. Un point important est que certains en-têtes, même s'ils sont présents dans la réponse, neAccess-Control-Expose-Headers
seront pas récupérés par le navigateur s'ils ne sont pas inclus dans l'en- tête.
Comment le réparer?
Était-ce juste une faute de frappe? Parfois, le code JavaScript n'a qu'une faute de frappe dans le domaine cible. Avez-vous vérifié? Si la page est à, www.example.com
il ne fera que des appels réguliers à www.example.com
! D'autres URL, telles que api.example.com
ou même example.com
ou www.example.com:8080
sont considérées comme des domaines différents par le navigateur! Oui, si le port est différent, alors c'est un domaine différent!
Ajoutez les en-têtes. Le moyen le plus simple d' activer CORS consiste à ajouter les en-têtes nécessaires (as Access-Control-Allow-Origin
) aux réponses du serveur. (Chaque serveur / langue a un moyen de le faire - vérifiez quelques solutions ici .)
Dernier recours: si vous ne disposez pas d'un accès côté serveur au service, vous pouvez également le mettre en miroir (via des outils tels que des proxys inverses ) et y inclure tous les en-têtes nécessaires.