65 votes

Appel interdomaine AJAX

- Je savoir sur AJAX cross-domain politique. Donc je ne peux pas juste d'appeler "http://www.google.com" plus d'un ajax requête HTTP et l'affichage les résultats quelque part sur mon site.

Je l'ai essayé avec le type de données "jsonp", qui en fait, mais j'obtiens une erreur de syntaxe (évidemment parce que les données reçues sont pas JSON formaté)

Est-il une autre possibilité de recevoir/afficher les données d'un domaine étranger? iFrames suivez la même politique?

Cordialement

--Andy

66voto

Tatu Ulmanen Points 52098

Le seul moyen (facile) d'obtenir des données inter-domaines à l'aide d'AJAX consiste à utiliser un langage côté serveur comme proxy, comme l'a noté Andy E. Voici un petit exemple pour implémenter cela en utilisant jQuery:

La partie jQuery:

 $.ajax({
    url: 'proxy.php',
    type: 'POST',
    data: {
        address: 'http://www.google.com'
    },
    success: function(response) {
        // response now contains full HTML of google.com
    }
});
 

Et le PHP (proxy.php):

 echo file_get_contents($_POST['address']);
 

Aussi simple que cela. Soyez simplement conscient de ce que vous pouvez ou ne pouvez pas faire avec les données récupérées.

19voto

alunny Points 785

Vous aurez besoin d'insérer dynamiquement une balise script dans la page qui référence les données. À l'aide de JSONP, vous pouvez exécuter une fonction de rappel quand le script est chargé.

La page de wikipedia sur JSONP a un concis exemple, la balise de script:

<script type="text/javascript" src="http://domain1.com/getjson?jsonp=parseResponse">
</script>

serait de renvoyer les données JSON enveloppé dans un appel à l' parseResponse:

parseResponse({"Name": "Cheeso", "Rank": 7})

(selon la configuration de l' getjson script sur domain1.com)

Le code à insérer la balise de façon dynamique serait quelque chose comme:

var s = document.createElement("script");
s.src = "http://domain1.com/getjson?jsonp=parseResponse";
s.type = "text/javascript";
document.appendChild(s);

16voto

Vous pouvez utiliser YQL pour effectuer la demande sans avoir à héberger votre propre proxy. J'ai créé une fonction simple pour faciliter l'exécution des commandes:

 function RunYQL(command, callback){
     callback_name = "__YQL_callback_"+(new Date()).getTime();
     window[callback_name] = callback;
     a = document.createElement('script');
     a.src = "http://query.yahooapis.com/v1/public/yql?q="
             +escape(command)+"&format=json&callback="+callback_name;
     a.type = "text/javascript";
     document.getElementsByTagName("head")[0].appendChild(a);
}
 

Si vous avez jQuery, vous pouvez utiliser $ .getJSON à la place.

Un échantillon peut être ceci:

 RunYQL('select * from html where url="http://www.google.com/"',
       function(data){/* actions */}
);
 

11voto

Andy E Points 132925

Malheureusement (ou heureusement) pas. La politique inter-domaines existe pour une raison: si elle était facile à contourner, elle ne serait pas très efficace en tant que mesure de sécurité. Hormis JSONP, la seule option consiste à utiliser un proxy pour les pages à l'aide de votre propre serveur .

Avec un iframe, ils sont soumis à la même politique. Bien sûr, vous pouvez afficher les données d'un domaine externe, vous ne pouvez simplement pas les manipuler.

4voto

jAndy Points 93076

après avoir fait quelques recherches, la seule "solution" à ce problème est l'appel de:

if($.browser.mozilla)
   netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');

ce sera de demander à l'utilisateur s'il permet à un site web pour continuer. Après il a confirmé que tous les les appels ajax, indépendamment de son type de données sera exécuté.

Cela fonctionne pour les navigateurs mozilla, IE < 8, un utilisateur doit permettre à une croix de domaine d'appel de manière similaire, une version besoin pour obtenir configuré dans les options du navigateur.

chrome/safari: je n'ai pas trouvé une config drapeau pour les navigateurs jusqu'à présent.

à l'aide de JSONP comme type de données serait bien, mais dans mon cas, je ne sais pas si un domaine que j'ai besoin d'accès prend en charge les données dans ce format.

Un autre coup de feu est d'utiliser HTML5 postMessage qui fonctionne de la croix-domaine aussi, mais je ne peux pas les moyens de doom mes utilisateurs pour les navigateurs HTML5.

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