89 votes

jQuery xml erreur " Non "Access-Control-Allow-Origin' en-tête est présent sur la ressource demandée.'

Je suis en train de travailler sur ce projet personnel à moi, juste pour le plaisir, où je veux lire un fichier xml qui est situé à http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml et parser le xml et l'utiliser pour convertir des valeurs entre les monnaies.

Jusqu'à présent, j'en suis venu avec le code ci-dessous qui est assez basique, afin de lire le fichier xml, mais j'obtiens l'erreur suivante.

XMLHttpRequest ne peut pas charger **. Pas De "Access-Control-Allow-Origin' l'en-tête est présent sur la ressource demandée. Origine 'http://run.jsbin.com' est donc pas autorisé à accéder.

$(document).ready( 
    function() {     
        $.ajax({          
            type:  'GET',
            url:   'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml',
            dataType: 'xml',              
            success: function(xml){
                alert('aaa');
            }
         });
    }
);

Je ne vois rien de mal avec mon code donc je suis en espérant que quelqu'un peut ce que je fais de mal avec mon code et comment j'ai pu le résoudre.

163voto

acdcjunior Points 19898

Vous ne serez pas en mesure d'accéder à l'URL http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml à partir d'un fichier déployée à l' http://run.jsbin.com en raison de la même origine politique.


Que la source (origine) de la page et l'URL de la cible sont à différents domaines, votre code est en fait d'essayer de faire un Cross-domain (SCRO) demande, pas un simple GET.

En quelques mots, la même politique d'origine impose que les navigateurs autoriser uniquement les appels Ajax pour les services dans le même domaine que la page HTML.


Exemple: Une page en http://www.example.com/myPage.html ne peut directement demander à des services qui sont en http://www.example.com, comme http://www.example.com/testservice/etc. Si le service est dans un autre domaine, le navigateur ne fera pas l'appel direct (que vous attendez). Au lieu de cela, il va essayer de faire un SCRO demande.

En résumé, pour faire de la SCRO demande, votre navigateur:

  • Envoie d'abord un OPTION demande à l'URL cible
  • Et ensuite, seulement si la réponse du serveur pour qu' OPTION contient le adéquates en-têtes (Access-Control-Allow-Origin est l'un d'entre eux) afin de permettre la SCRO demande, le parcourir effectuera l'appel (presque exactement la façon dont il le ferait si la page HTML est dans le même domaine).
    • Si la durée des en-têtes ne viennent pas, le navigateur donne simplement (comme il l'a fait pour vous).

Comment le résoudre? Le plus simple est d'activer la SCRO (activer le nécessaire en-têtes) sur le serveur.

Si vous n'avez pas de serveur-côté de l'accès au service, vous pouvez également du miroir, et comprennent de nécessaire les en-têtes.

29voto

jyapayne Points 159

Il y a une sorte de hack-tastic façon de le faire si vous avez de php sur votre serveur. Modifier cette ligne:

url:   'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml',

à cette ligne:

url: '/path/to/phpscript.php',

et puis, dans le script php (si vous avez la permission d'utiliser le file_get_contents ()):

<?php

header('Content-type: application/xml');
echo file_get_contents("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");

?>

Php ne semble pas à l'esprit que si l'url est à partir d'une origine différente. Comme je l'ai dit, c'est un hacky réponse, et je suis sûr qu'il ya quelque chose de mal avec elle, mais cela fonctionne pour moi.

Edit: Si vous souhaitez mettre en cache le résultat en php, voici le fichier php que vous utilisez:

<?php

$cacheName = 'somefile.xml.cache';
// generate the cache version if it doesn't exist or it's too old!
$ageInSeconds = 3600; // one hour
if(!file_exists($cacheName) || filemtime($cacheName) > time() + $ageInSeconds) {
  $contents = file_get_contents('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
  file_put_contents($cacheName, $contents);
}

$xml = simplexml_load_file($cacheName);

header('Content-type: application/xml');
echo $xml;

?>

La mise en cache de code de la prendre d' ici.

0voto

Sujeewa Points 151

Si vous voulez le faire dans ASP.net MVC environnement avec JQuery, AJAX, cochez cette réponse: http://stackoverflow.com/a/23501289/1658297

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X