171 votes

Que signifie le fait qu'une requête HTTP renvoie le code d'état 0 ?

Que signifie le fait que les appels réseau JavaScript tels que fetch ou XMLHttpRequest, ou tout autre type de demande réseau HTTP, échouent avec un code d'état HTTP de 0 ?

Cela ne semble pas être un code d'état HTTP valide, car les autres codes sont à trois chiffres dans la spécification HTTP.

J'ai essayé de débrancher complètement le réseau à titre de test. Cela n'a peut-être aucun rapport, mais cela a donné le code d'état 17003 (IIRC), qui, selon une recherche rapide, signifie "échec de la consultation du serveur DNS".

Le même code fonctionne bien à partir de certains sites et systèmes, mais dans certains environnements, il échoue avec le code d'état 0 et aucun texte de réponse n'est fourni.

Il s'agit d'un POST HTTP typique vers une URL Internet. Il n'implique pas file:// qui, d'après ce que j'ai compris, peut retourner 0 en indiquant le succès dans Firefox.

0 votes

Cela pourrait-il être dû au pare-feu ? Sur quel système d'exploitation votre client exécute-t-il l'application ?

0 votes

Cela pourrait être utile : stackoverflow.com/a/12622082/386579

0 votes

245voto

Lee Whitney Points 3570

Beaucoup de réponses ici sont fausses. Il semble que les gens trouvent ce qui a causé le statut==0 dans leur cas particulier et le généralisent comme étant la réponse.

En pratique, le statut==0 pour un échec de XmlHttpRequest doit être considéré comme une erreur non définie.

La spécification W3C actuelle définit les conditions pour lesquelles zéro est retourné ici : https://fetch.spec.whatwg.org/#concept-network-error

Comme vous pouvez le voir dans la spécification (fetch ou XmlHttpRequest), ce code pourrait être le résultat d'une erreur survenue avant même que le serveur ne soit contacté.

Certaines des situations courantes qui produisent ce code d'état sont reflétées dans les autres réponses, mais il peut s'agir de n'importe lequel de ces problèmes ou d'aucun :

  1. Demande d'origine croisée illégale (voir CORS )
  2. Blocage ou filtrage du pare-feu
  3. La demande elle-même a été annulée en code
  4. Une extension de navigateur installée perturbe le fonctionnement du système.

Ce qui serait utile, c'est que les navigateurs fournissent des rapports d'erreur détaillés pour un plus grand nombre de ces scénarios status==0. En effet, parfois, le statut==0 s'accompagne d'un message console utile, mais dans d'autres cas, il n'y a aucune autre information.

4 votes

L'addon Firefox NoScript peut annuler les requêtes XHR vers des hôtes non fiables.

13 votes

+1, tout cela est exact et "une sorte d'erreur s'est produite" est l'interprétation pratique. Pour les personnes intéressées par une liste complète des causes possibles données par la spécification, j'ai publié une analyse à l'adresse suivante stackoverflow.com/a/26451773/1709587 .

1 votes

Parmi les cas détaillés par Mark Amery qui me posent le plus de problèmes, il y a le cas des cors. Si l'erreur fait échouer la validation cors de la réponse, vous obtiendrez un statut 0 au lieu du statut http, puisque lorsque la validation cors échoue, la réponse n'est pas accessible. C'est particulièrement frustrant lorsqu'on essaie de détecter une api web en cours de maintenance et qui répond à 503. Si cette api n'honore pas les cors pendant qu'elle est en maintenance, vous ne pourrez pas détecter le 503, vous obtiendrez juste 0, ce qui peut être causé par tant d'autres choses.

68voto

Nick Points 1082

Je pense que le code d'erreur indique que la réponse était vide, (puisque même les en-têtes n'ont pas été renvoyés). Cela signifie que la connexion a été acceptée puis fermée gracieusement (TCP FIN). Il y a un certain nombre de choses qui pourraient causer cela, mais d'après votre description, une forme de pare-feu semble être le coupable le plus probable.

2 votes

Je pense que vous avez probablement raison. (Bien que, comme l'a fait remarquer @sleepycod, wininet.dll devrait renvoyer un code d'état en l'absence d'un fichier réel code d'état http).

1 votes

Ce n'est pas nécessairement correct. J'ai eu le même problème, mais dans mon cas, une requête n'a jamais été envoyée. La raison en était qu'un bloqueur de publicité Firefox empêchait les requêtes dont l'URL contenait le mot banner

0 votes

Faux. Il existe trois catégories d'erreurs pour lesquelles vous obtiendrez un status=0 : abort, timeout et error. Les deux premières sont explicites. Error indique qu'une erreur au niveau du réseau s'est produite et, par expérience, elle est généralement enregistrée dans la console.

35voto

Cory R. King Points 1634

Pour ce que cela vaut, selon le navigateur, les appels AJAX basés sur jQuery appelleront votre callback de réussite avec un code d'état HTTP de 0. Nous avons constaté qu'un code d'état de "0" signifie généralement que l'utilisateur a navigué vers une autre page avant que l'appel AJAX ne soit terminé.

Ce n'est pas la même pile technologique que celle que vous utilisez, mais j'espère qu'elle sera utile à quelqu'un.

0 votes

Oui, les gens se posent probablement souvent cette question, puisque cette page a eu 10 000 vues.

0 votes

Ou devrais-je dire 25 000 vues ?

3 votes

Cela vaut beaucoup : c'est exactement ce qui faisait défaut dans mes tests automatisés. Merci beaucoup !

16voto

Christophe Eblé Points 4606

wininet.dll renvoie les codes d'état standard et non standard qui sont énumérés ci-dessous.

401 - Unauthorized file
403 - Forbidden file
404 - File Not Found
500 - some inclusion or functions may missed
200 - Completed

12002 - Server timeout
12029,12030, 12031 - dropped connections (either web server or DB server)
12152 - Connection closed by server.
13030 - StatusText properties are unavailable, and a query attempt throws an exception

Pour le code d'état "zéro", essayez-vous d'effectuer une requête sur une page web locale fonctionnant sur un serveur web ou sans serveur web ?

XMLHttpRequest status = 0 et XMLHttpRequest statusText = inconnu peut vous aider si vous n'exécutez pas votre script sur un serveur web.

1 votes

Merci pour les codes. Non, il ne s'agit pas d'une requête locale, mais d'une requête adressée à un serveur web sur Internet, à partir d'un vbscript exécuté localement.

6voto

mike nelson Points 3819

Solution de rechange : ce que nous avons fini par faire

Nous avons pensé qu'il s'agissait d'un problème de pare-feu, et nous avons donc trouvé une solution de contournement qui a fonctionné. Si quelqu'un a ce même problème, voici ce que nous avons fait :

  1. Nous écrivons toujours les données dans un fichier texte sur le disque dur local, comme nous le faisions auparavant, en utilisant un HTA.

  2. Lorsque l'utilisateur clique sur "renvoyer les données au serveur", le HTA lit les données et écrit une page HTML qui inclut ces données sous la forme d'un îlot de données XML (en fait, il utilise un bloc script LANGUAGE=XML script).

  3. L'ETS lance un lien vers la page HTML dans le navigateur.

  4. La page HTML contient maintenant le javascript qui envoie les données au serveur (en utilisant Microsoft.XMLHTTP).

J'espère que cela aidera toute personne ayant des besoins similaires. Dans ce cas, il s'agissait d'un jeu Flash utilisé sur un ordinateur portable lors de salons professionnels. Nous n'avons jamais eu accès à l'ordinateur portable et nous ne pouvions que l'envoyer par e-mail au client, car le salon se déroulait dans un autre pays.

0 votes

Bonjour, j'enquête sur un problème similaire qui se produit chez un client en production. Vous dites que le problème pour vous a été causé par un pare-feu. Vous souvenez-vous de l'effet causé par le pare-feu, ou de ce que faisait le pare-feu pour causer ce problème ?

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