Demander un contenu sur un autre domaine / serveur

J'essaie de demander des données qui se trouvent sur un autre domaine / serveur, mais je reçois une exception lorsque j'essaie d'envoyer la demande.

var request = new XMLHttpRequest(); request.open("GET", "http://www.w3schools.com/ajax/cd_catalog.xml", false); request.send(); 

L'erreur:

Exception non saisie: [Exception … "Composant renvoyé code d'échec: 0x80004005 (NS_ERROR_FAILURE)" nsresult: "0x80004005 (NS_ERROR_FAILURE)"]

Est-ce la bonne façon de demander un contenu qui ne se trouve pas sur le même domaine / serveur? Ou est-ce qu'il y a un autre moyen d'y parvenir?

Je teste cela dans Firefox 8.0, mais j'aimerais avoir une solution qui pourrait fonctionner pour tous les principaux navigateurs modernes.

Vous ne pouvez pas récupérer le contenu d'un autre domaine directement. Vous pouvez récupérer du contenu via un serveur qui effectue le travail pour vous (proxy), ou en utilisant quelque chose comme JSONP. Consultez cette page wikipedia .

Pour plus d'informations sur le sujet, cette page peut être intéressante

Pour des raisons de sécurité, une demande comme celle-ci ne fonctionnera pas. Imaginez si un domaine pourrait accéder aux données d'un autre domaine – vous finiriez avec n'importe quel site (p. Ex. http://Www.sketchyattacksite.com) pour pouvoir extraire du contenu arbitraire de tout autre site (par exemple, http://www.bankofamerica.com), y compris un utilisateur authentifié Des informations de session confidentielles. La même politique d'origine , mise en œuvre par tous les navigateurs modernes, existe pour éviter que de telles violations de sécurité ne se produisent.

Il existe quelques façons courantes de contourner la même politique d'origine:

  1. Le domaine sur lequel vous demandez des données peut retourner ces données sous la forme de JSONP (qui vous permet de le charger comme s'il s'agissait d'un script externe, non soumis à la même politique d'origine). Souvent, les sites fourniront un format JSONP dans leurs API, par exemple: https://graph.facebook.com/cocacola?callback=name_of_function_to_pass_data_via_jsonp
  2. Cross-Origin Resource Sharing (CORS) est une norme récente, donc ne fonctionnera que dans les navigateurs plus récents, mais permet aux sites de spécifier (via un en-tête HTTP) les domaines qu'ils permettront d'accéder à leurs données. Par exemple, si Bank of America, pour une raison quelconque, voulait permettre à http://www.sketchyattacksite.com de faire des demandes à http://www.bankofamerica.com, ils pourraient renvoyer un en Access-Control-Allow-Origin: sketchyattacksite.com tête Access-Control-Allow-Origin: sketchyattacksite.com .
  3. Un serveur proxy. Vous pouvez créer un gestionnaire sur votre serveur, dont la seule fonction est de récupérer votre fichier cible http://www.w3schools.com/ajax/cd_catalog.xml et de le renvoyer sur votre domaine. Notez que cela résout le problème des données confidentielles potentiellement passées, car au lieu du navigateur des utilisateurs qui effectue la demande, votre serveur (qui n'a pas accès aux cookies de l'utilisateur sur w3schools.com) le fait.

Dans ce cas particulier, il semble que # 3, un proxy serveur, soit la réponse. Pourquoi? Parce que vous n'avez pas le contrôle du site sur lequel vous demandez les données (ce qui signifie que vous ne pouvez pas utiliser # 1 ou # 2, à moins que w3schools.com n'ait choisi de les mettre en œuvre).

Voici un exemple PHP simple d'un proxy serveurs , courtoisie de Yahoo !. La clé est qu'elle est verrouillée pour ne tirer que du contenu de domaines spécifiques (de sorte que les mauvais acteurs ne peuvent pas l'utiliser pour des demandes arbitraires qui semblent être faites en votre nom), au-delà de cela, il est aussi simple que de demander l'URL cible via Curl et le renvoyer à l'utilisateur. Notez que vous pouvez également ajouter une mise en cache pour éviter que chaque chargement de votre proxy serveurs déclenche une nouvelle demande pour le fichier http://www.w3schools.com/ajax/cd_catalog.xml .

Est une demande de domaine croisé, elle est toujours effectuée en utilisant un proxy sur le serveur. Vous créez une demande de serveur et appelez http://www.w3schools.com/ajax/cd_catalog.xml sur cette page comme abc.apsx et appelez votre propre abc.aspx à l'aide du javascript

 var request = new XMLHttpRequest(); request.open("GET", "abc.aspx"); request.send(); 

C'est ce qu'on appelle Cross-Domain Ajax, la plupart des navigateurs considèrent qu'il s'agit d'une violation de sécurité. Une solution de contournement est de créer un composant côté serveur (le même domaine que la page que vous consultez) qui demandera les données de l'autre serveur (/ http://www.w3schools.com dans votre cas) et résume cela à votre demande Ajax.

Ces liens expliqueront le problème et plusieurs solutions:

http://jimbojw.com/wiki/index.php?title=Introduction_to_Cross-Domain_Ajaxrequest

http://usejquery.com/posts/the-jquery-cross-domain-ajax-guide