web-dev-qa-db-fra.com

Réponse videText from XMLHttpRequest

J'ai écrit un XMLHttpRequest qui fonctionne bien mais renvoie un responseText vide.

Le javascript est le suivant:

  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 bien. Je peux passer et je reçois le readyState == 4 et un statut == 200 mais le responseText est toujours vide.

Je reçois une erreur de journal (dans le débogage de Safari) de la répartition des erreurs: getProperties, à laquelle je n'arrive pas à trouver de référence. 

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

L'URL, une fois placée dans un navigateur, renverra la chaîne et donnera un code d'état de 200.

J'ai écrit un code similaire sur la même URL dans un widget Widget qui fonctionne correctement, mais le même code dans un navigateur ne renvoie jamais de résultat.

27
PurplePilot

http://api.xxx.com/ fait-il partie de votre domaine? Sinon, vous êtes bloqué par la même politique d'origine .

Vous voudrez peut-être consulter la publication Stack Overflow suivante pour quelques solutions de contournement:

26
Daniel Vassallo

PROBLÈME RÉSOLU

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

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

Mais la bonne façon est de passer la valeur de l'URL comme:

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

Certains navigateurs ne sont pas en conflit et ne font aucune distinction entre les textes, mais dans Firefox 3.6 pour Mac OS, prenez ce chemin complet comme "cross site scripting" ... autre chose, dans Dans le même navigateur, il existe une distinction entre:

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

Et met

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

En fait, c’est la vue correcte, mais la plupart des implémentations ne font aucune distinction. La solution consistait donc à supprimer tout le texte spécifiant le chemin complet du script dans les méthodes exécutant la demande ajax . AND .... supprime les balises BASE du fichier index.html

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

Si vous ne le supprimez pas, cette version du navigateur de ce système peut accepter votre demande ajax comme s'il s'agissait d'une demande intersite!

J'ai le même problème mais seulement sur la machine Mac OS. Le problème est que Firefox traite la réponse ajax comme un appel "entre sites". Dans tout autre ordinateur/navigateur, cela fonctionne bien. Je n'ai trouvé aucune aide à ce sujet (je pense qu'il s'agit d'un problème d'implémentation de firefox), mais je vais prouver le code suivant côté serveur:

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

pour que ce navigateur obtienne les données en tant que "données json" ...

12
Ivan David

Le navigateur vous empêche de créer des scripts entre sites.

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

4
Jacob Relkin

Ce n'est peut-être pas la meilleure façon de le faire. Mais cela a fonctionné pour moi, alors je vais courir avec.

Dans ma fonction php qui renvoie les données, une ligne avant la ligne de retour, j'ajoute une instruction echo, qui renvoie les données que je veux envoyer.

Maintenant, bien sûr, pourquoi cela a fonctionné, mais cela a fonctionné. 

1
swl1020

Avait un problème similaire au vôtre. Ce que nous devions faire, c'est utiliser la solution document.domain trouvée ici:

Moyens de contourner la politique de même origine

Nous devions également changer les choses du côté des services Web. Utilisé l'en-tête "Access-Control-Allow-Origin" trouvé ici:

https://developer.mozilla.org/En/HTTP_access_control

0
wkm