2009-12-21 6 views
25

J'ai écrit un XMLHttpRequest qui s'exécute bien mais retourne un responseText vide.AnswerText vide de XMLHttpRequest

Le javascript est la suivante:

var anUrl = "http://api.xxx.com/rates/csv/rates.txt"; 
    var myRequest = new XMLHttpRequest(); 

    callAjax(anUrl); 

    function callAjax(url) { 
    myRequest.open("GET", url, true); 
    myRequest.onreadystatechange = responseAjax; 
       myRequest.setRequestHeader("Cache-Control", "no-cache"); 
    myRequest.send(null); 
    } 

    function responseAjax() { 
    if(myRequest.readyState == 4) { 
     if(myRequest.status == 200) { 
      result = myRequest.responseText; 
      alert(result); 
      alert("we made it"); 
     } else { 
      alert(" An error has occurred: " + myRequest.statusText); 
     } 
    } 
    } 

Le code fonctionne très bien. Je peux passer à travers et j'obtiens le readyState == 4 et un statut == 200 mais le responseText est toujours vide.

Je reçois une erreur de log (dans le débogage de Safari) de Error dispatching: getProperties auquel je n'arrive pas à trouver de référence.

J'ai exécuté le code dans Safari et Firefox localement et sur un serveur distant.

L'URL lorsqu'il est mis dans un navigateur retournera la chaîne et de donner un code d'état de 200.

j'ai écrit un code similaire à la même URL dans un Widget Mac qui fonctionne très bien, mais le même code dans un navigateur ne renvoie jamais de résultat.

+3

Quelque chose que j'ai découvert ce qui a conduit à une partie de ma confusion initiale est que Safari a un modèle de sécurité modifié qui permet aux fichiers en cours d'exécution d'accéder localement demandes de toute origine. Cela a été fait pour que Dashboard Widgets demandes d'accès à froid. Donc, j'ai d'abord écrit un widget, cela fonctionnerait, alors quand je n'ai pas utilisé Safari ou de la machine locale ce ne serait pas. Cependant, je viens juste de rencontrer ce tweak. – PurplePilot

Répondre

25

Est-ce que votre domaine est http://api.xxx.com/? Sinon, vous êtes bloqué par le same origin policy.

Vous pouvez consulter la pile suivante après débordement pour quelques solutions de contournement possibles:

+0

j'avais un sentiment qui pourrait être cela. L'aspect déconcertant de ceci est que dans un Widget Mac j'ai utilisé XMLHttpRequest pour faire la même chose et cela fonctionne. Je suppose que dans le cas du widget je ne suis pas dans un navigateur donc pas bloqué. – PurplePilot

+2

En fait, cela n'a rien à voir avec xss, qui est causé par l'échec de la validation de l'entrée de l'utilisateur. L'utilisation de XHR pour accéder à un autre domaine constitue une violation de la règle de la même origine: http://code.google.com/p/browsersec/wiki/Part2 – rook

+0

@The Rook: Merci pour la note. J'ai corrigé ma réponse. –

4

Le navigateur vous empêche de cross-site scripting.

Si l'URL est en dehors de votre domaine, vous devez le faire du côté serveur ou le déplacer dans votre domaine.

11

Le problème est résolu

Dans mon cas, le problème était que je fais l'appel ajax (avec .ajax $, .get $ ou .getJSON $ méthodes de jQuery) avec chemin complet dans l'url param :

url: "http://mydomain.com/site/cgi-bin/serverApp.php"

Mais la bonne façon est de passer la valeur url comme:

url: "site/cgi-bin/serverApp.php"

Certains navigateur ne sont pas incompatibles et ne font aucune distiction entre un texte ou d'une autre, mais dans Firefox 3.6 pour Mac OS prendre ce chemin complet en tant que "cross site scripting" ...Une autre chose, dans le même navigateur, il y a une distinction entre:

http://mydomain.com/site/index.html

Et mettre

http://www.mydomain.com/site/index.html

En fait, il est le point de vue du point correct, mais la plupart des implémentations ne font aucune distinction, donc la solution était de supprimer tout le texte qui spécifient le chemin complet au script dans les méthodes qui font la requête ajax ET .... supprimer BASE tag dans le fichier index.html

base href = "http://mydomain.com/" < --- mauvaise idée, retirez-le!

Si vous ne le supprimez pas, cette version du navigateur pour ce système peut prendre votre requête ajax comme s'il s'agissait d'une requête intersite!

J'ai le même problème, mais uniquement sur la machine Mac OS. Le problème est que Firefox traite la réponse ajax comme un appel "cross site", dans tout autre machine/navigateur, cela fonctionne très bien. Je ne l'ai pas trouvé aucune aide à ce sujet (je pense que c'est une question de mise en œuvre firefox), mais je vais prouver le code suivant du côté serveur:

header('Content-type: application/json'); 

pour faire en sorte que navigateur obtenir les données "données JSON" ...

+0

Ajout de l'en-tête de réponse Content-Type: application/json a fonctionné pour moi. –

1

Cela pourrait ne pas être la meilleure façon de le faire. Mais ça a fonctionné pour moi, alors je vais courir avec.

Dans ma fonction php qui retourne les données, une ligne avant la ligne de retour, j'ajoute une déclaration d'écho, en écho aux données que je veux envoyer.

Maintenant, assurez-vous que cela a fonctionné, mais c'est le cas.