web-dev-qa-db-fra.com

Statut XMLHttpRequest (responseText est vide)

Impossible d'obtenir des données avec XMLHttpRequest (statut 0 et responseText est vide):

 xmlhttp = new XMLHttpRequest (); 
 xmlhttp.open ("GET", "http://www.w3schools.com/XML/cd_catalog.xml", true); 
 xmlhttp.onreadystatechange = function () 
 {
 if (xmlhttp.readyState == 4) 
 alert ("status" + xmlhttp.status); 
} 
 xmlhttp.send (); 

Il alerte "état 0".

La même situation avec la demande localhost (cd_catalog.xml est enregistré en tant que fichier local)

 xmlhttp.open ("GET", "http: //localhost/cd_catalog.xml", true); 

Mais avec la demande IP localhost

 xmlhttp.open ("GET", "http://127.0.0.1/cd_catalog.xml", true); 

et avec la demande de fichier local

 xmlhttp.open ("GET", "cd_catalog.xml", true); 

tout va bien (statut 200)

Qu'est-ce qui peut causer le problème (status = 0) avec la demande en ligne?

PS: Live HTTP Headers montre que tout va bien dans les 4 cas suivants:

 HTTP/1.1 200 OK 
 Longueur du contenu: 4742 

PS2: serveur Web local Apache sur VMWare (OS hôte Win7, OS invité Ubuntu, carte réseau - NAT). Navigateur - Firefox.

87
arigasa

l'état est 0 lorsque votre fichier html contenant le script est ouvert dans le navigateur via le schéma de fichiers. Assurez-vous de placer les fichiers sur votre serveur (Apache ou Tomcat, peu importe), puis ouvrez-le via le protocole http dans le navigateur. (i.e. http: //localhost/myfile.html ) Voici la solution.

38
Abhishek_8

La cause de vos problèmes est que vous essayez de faire un appel entre domaines et cela échoue .

Si vous faites du développement localhost, vous pouvez faire des appels entre domaines. Je le fais tout le temps. 

Pour Firefox, vous devez l'activer dans vos paramètres de configuration

signed.applets.codebase_principal_support = true

Ajoutez ensuite quelque chose comme ceci à votre code ouvert XHR:

  if (isLocalHost()){
    if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){
      netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
    }
  }

Pour IE, si je me souviens bien, il vous suffit d'activer le paramètre de sécurité du navigateur sous "Divers → Accéder aux sources de données sur plusieurs domaines" pour qu'il fonctionne avec ActiveX XHR. 

IE8 et les versions ultérieures ont également ajouté des fonctionnalités interdomaines aux objets XmlHttpRequest natifs, mais je n'ai pas encore joué avec ceux-ci.

26
Slammer

En fait, assurez-vous que le type de votre bouton est Button not Submit, ce qui a provoqué un conflit de statut que j'ai rencontré récemment.

25
dyuan

Si le serveur répond à une méthode OPTIONS et à GET et POST (quelle que soit celle que vous utilisez) avec un en-tête tel que:

Access-Control-Allow-Origin: *

Cela pourrait fonctionner correctement. Il semble que dans FireFox 3.5 et rekonq 0.4.0 . Apparemment, avec cet en-tête et la réponse initiale à OPTIONS, le serveur dit au navigateur: "Allez-y et laissez cette requête interdomaine passer".

16
Alex Robinson

Considérez également le request timeout:

Le navigateur moderne renvoie readyState = 4 et status = 0 si trop de temps s'écoule avant la réponse du serveur.

9
Andrea Savojardo

Ajoutez setRequestHeader("Access-Control-Allow-Origin","*") à la réponse de votre serveur.

6
Ivan

Ouvrir console javascript . Vous verrez un message d'erreur ici. Dans mon cas, c’était la SCRO.

3
Jarekczek

J'avais rencontré un problème similaire. Tout était ok, le "readystate" valait 4, mais le "status" était 0. C'était parce que j'utilisais un serveur portable Apache PHP et que mon fichier dans lequel j'avais utilisé l'objet "XMLHttpRequest" était un fichier html fichier. J'ai changé l'extension du fichier en php et le problème a été résolu.

3
Reyan

Pour répondre à la question de savoir pourquoi http://127.0.0.1/cd_catalog.xml fonctionne alors que http://localhost/cd_catalog.xml ne le fait pas: Firefox traite 127.0.0.1 et localhost comme deux domaines différents.

2
Tomi Aarnio

Alex Robinson donne déjà (et le premier) la bonne réponse à ce problème. Mais pour élaborer un peu plus ...

Vous devez ajouter l'en-tête de réponse HTTP:

Access-Control-Allow-Origin: *

Si vous faites cela, le résultat n'est pas simplement «pourrait fonctionner», mais «fonctionnera».

Remarque: vous devez ajouter un en-tête HTTP response. Vous ne pouvez le faire que sur un serveur que vous contrôlez. Il ne sera jamais possible d'extraire directement http://w3schools.com/XML/cd_catalog.xml depuis son URL d'origine à l'aide de XMLHttpRequest (selon la question de l'OP), car cette ressource du 24 avril 2015) comprennent tout en-tête CORS.

http://en.wikipedia.org/wiki/Cross-Origin_resource_sharing donne plus d'informations.

1
Mike Beaton

Voici un autre cas dans lequel status === 0, spécifique au téléchargement:

Si vous associez un gestionnaire d'événement 'load' à XHR.upload, sous la forme suggéré par MDN (faites défiler jusqu'à la partie du téléchargement de "Suivi de la progression"), l'objet XHR aura status=0 et toutes les autres propriétés seront des chaînes vides. Si vous attachez le gestionnaire 'load' directement à l'objet XHR, comme vous le feriez lors du téléchargement de contenu, tout devrait bien se passer (si vous n'utilisez pas localhost).

Cependant, si vous souhaitez obtenir de bonnes données dans vos gestionnaires d'événements 'progress', vous devez associer un gestionnaire à XHR.upload, not directement à l'objet XHR lui-même.

Jusqu'ici, je n'ai testé cette fonctionnalité que sur Chrome OSX. Je ne suis donc pas sûr de l'ampleur du problème dans la documentation de MDN et de l'implémentation de Chrome ...

1
ericsoco

Je devais ajouter (à nouveau) mon adresse IP actuelle à la liste blanche de Atlas MongoDB et me débarrasser ainsi de l'erreur XMLHttpRequest status 0

0
Anja

Pour voir quel est le problème, quand vous obtenez l'erreur cryptique 0, allez à ... | Plus d'outils | Outils de développement (Ctrl + Maj + I) dans Chrome (sur la page générant l'erreur)

Lisez le texte rouge dans le journal pour obtenir le vrai message d'erreur. S'il y en a trop, cliquez avec le bouton droit de la souris et effacer la console, puis refaites votre dernière demande. 

Mon premier problème était que je passais pour la première fois en-tête d'autorisation à mon propre service Web interdomaine pour le navigateur.

J'ai déjà eu: 

Access-Control-Allow-Origin: *

Mais non:

Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Allow-Headers: Authorization

dans l'en-tête de réponse de mon service Web.

Après avoir ajouté cela, mon zéro serveur a été renvoyé à zéro, ainsi que lors de l'exécution locale du fichier index.html sans serveur Web, mais il y avait toujours des erreurs de code.

Retour à ... | Plus d'outils | Outils de développement tout en obtenant l'erreur dans codepen, et il est clairement expliqué: codepen utilise https, je ne peux donc pas appeler http, car la sécurité est moindre. 

Je dois donc héberger mon service Web sur https.

Savoir comment obtenir le vrai message d'erreur - inestimable!

0
Maya

Mon problème similaire à celui-ci a été résolu en vérifiant mon code html. J'avais un gestionnaire onclick dans mon bouton d'envoi de formulaire à une méthode. comme ceci: onclick="sendFalconRequestWithHeaders()". Cette méthode à son tour appelle ajax comme le vôtre et fait ce que je veux. Mais pas comme prévu, mon navigateur ne retournait rien.

Appris de quelqu'un de dur , j'ai retourné faux dans ce gestionnaire, et résolu… .. Laissez-moi vous dire qu'avant d'arriver à ce poste, j'ai passé tout un week-end de trois jours et demi au bureau à écrire du code implémentation de CORS filters, jetty config, autres trucs liés à jersey and embedded jetty - juste pour résoudre ça., revenant à ma compréhension de tout ce qui concerne cross domain ajax requests et les standards. C'était ridicule de voir à quel point les erreurs simples en javascript vous rendaient stupide.

Pour être vrai, j'ai essayé signed.applets.codebase_principal_support = true et écrit isLocalHost() **if**. peut-être que cette méthode doit être mise en œuvre par nous, firefox dit qu'il n'y en a pas Maintenant, je dois nettoyer mon code pour soumettre git patch proprement. Merci à quelqu'un.

0
Siva Tumma

Alex Robinson et bmju ont fourni des informations précieuses pour comprendre les problèmes d’origine croisée. Je voulais ajouter que vous devrez peut-être faire un appel OPTIONS explicite dans votre code client avant d'effectuer le GET/POST souhaité (par exemple, contre un noeud final de service CORS OAuth). Votre navigateur/bibliothèque peut ne pas gérer automatiquement la demande OPTIONS. Gruber, c'est l'une des réponses possibles à votre question.

0
Tim McConnell

Je viens d'avoir ce problème parce que j'ai utilisé 0.0.0.0 comme serveur, je l'ai changé en localhost et cela fonctionne.

0
Vad

J'ai eu le même problème (readyState était 4 et status 0), puis j'ai suivi une approche différente expliquée dans ce tutoriel: https://spring.io/guides/gs/consuming-rest- jquery/

Il n'a pas du tout utilisé XMLHttpRequest, mais plutôt la méthode jquery $ .ajax ():

<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script src="hello.js"></script>
</head>

<body>
    <div>
        <p class="greeting-id">The ID is </p>
        <p class="greeting-content">The content is </p>
    </div>
</body>

et pour le fichier public/hello.js (ou vous pouvez l'insérer directement dans le même code HTML):

$(document).ready(function() 
 {
    $.ajax({
        url: "http://rest-service.guides.spring.io/greeting"
   }).then(function(data) {
      $('.greeting-id').append(data.id);
      $('.greeting-content').append(data.content);
   });
 });
0
RMDev

Une requête du navigateur "127.0.0.1/somefile.html" arrive inchangée sur le serveur Web local, alors que "localhost/somefile.html" peut arriver sous la forme "0: 0: 0: 0: 0: 0: 0: 1/somefile.html "si IPv6 est pris en charge . Ainsi, ce dernier peut être traité comme allant d’un domaine à un autre.

0
Massimo Roscio