2009-09-16 4 views
0

J'ai écrit un script qui interroge Twitter via les méthodes AJAX de Prototype, saisit les résultats JSON, les évalue, puis met à jour un div avec les tweets formatés. Tout a bien fonctionné lors des tests (Safari 4.0.3 sur une machine OS 10.6.1) jusqu'à ce que je charge le script sur un serveur et qu'il échoue. Le script avait tous les éléments côté client et faisait référence au même fichier Prototype.js, donc je ne peux pas comprendre pourquoi il fonctionnait localement mais pas à distance. J'ai dépouillé le script de son essence même - en renvoyant simplement le dernier tweet de ma ligne de temps dans une boîte d'alerte - et fonctionne/se casse comme décrit ci-dessus, ainsi que dans Firefox. Je suis sûr que je fais une erreur osseuse, mais je ne trouve pas l'erreur de mes manières.Simple AJAX JS fonctionne correctement localement dans Safari, échoue sur le serveur et dans Firefox (problème avec evalJSON())?

Voici l'intégralité de ma page. Fonctionne localement, pas sur le serveur ou dans Firefox:

<!DOCTYPE html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>Test</title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script> 


    <script type="text/javascript" charset="utf-8"> 
    document.observe("dom:loaded", function(){ 
     var tweetAddress = "http://twitter.com/status/user_timeline/hellbox.json?count=1"; 
     new Ajax.Request(tweetAddress, { 
      method: 'get', 
      onSuccess: function (transport) { 
       var tweets = transport.responseText.evalJSON(); 
       alert(tweets[0].text); 
      } 
     }); 
    }); 
    </script> 
</head> 
<body> 
</body> 
</html> 

Répondre

1

Vous frapper le mur « même politique d'origine ». Vous ne pouvez pas effectuer une requête AJAX sur twitter.com à partir d'une page chargée à partir d'un autre domaine.

Essayez JSONP au lieu de JSON:

http://jquery-howto.blogspot.com/2009/04/twitter-jsonjsonp-api-url.html

Avec JSON, une étiquette <script> sera injecté dans votre page, puis, une fonction de rappel sera appelé par le script chargé. Il n'y a pas de restrictions de domaine avec le chargement de scripts à partir de domaines externes.

0

Si je ne me trompe pas, vous essayez de faire une requête Ajax au domaine twitter.com.

Si votre application elle-même n'est pas hébergée sur ce domaine twitter.com, vous ne pouvez pas faire de requêtes Ajax: vous pouvez uniquement faire des requêtes Ajax au domaine sur lequel votre application est hébergée.

Cela signifie que si votre site Web est sur "www.mydomain.com", vous pouvez uniquement envoyer des requêtes Ajax à "www.mydomain.com".
Non "test.mydomain.com" ni "www.anotherdomain.com"

Ceci est dû à une restriction de sécurité mis en œuvre dans les navigateurs Web, appelé Same Origin Policy(citant):

la politique permet d'exécuter des scripts sur pages en provenance à partir du même site pour accéder aux méthodes de l'autre et propriétés sans restrictions spécifiques - mais empêche l'accès à la plupart des méthodes et propriétés à travers pages sur différents sites.

Une solution possible à ce problème pourrait être d'utiliser un proxy sur votre propre domaine, qui serait un proxy pour twitter.com; De cette façon, votre site Web pourrait envoyer des requêtes à votre domaine, et celles-ci seraient effectivement renvoyées à Twitter; pas de problème avec SOP, de cette façon. En tant que sidenote, Quand vous dites "ça fonctionnait localement": voulez-vous dire que vous avez un serveur web sur votre machine locale, et que ça fonctionnait quand il était servi depuis ce serveur? Cela n'aurait pas dû marcher, dans ce cas. En voulant dire "Ouvrir le fichier localement, avec quelque chose comme file: //.../myfile.html" dans la barre d'adresse du navigateur - peut-être que Safari n'a pas la même politique d'origine pour les documents locaux?
(pas sûr - juste une possibilité)

+0

Merci Pascal - Par localement, je voulais dire ouvrir le fichier directement à travers le chemin local, et cela a fonctionné. Cependant, le chargement via un serveur Web localhost a empêché l'exécution du fichier. –

+0

ok, merci pour l'explication. Chargement via un navigateur Web local, vous rencontrez la contrainte SOP dont je parlais, qui est le "comportement attendu" - vous devrez soit utiliser un proxy, ou construire dynamiquement une balise de script pour faire cela "Ajax" demande pour vous - vous pouvez probablement rechercher "JSONP" à ce sujet. –

Questions connexes