106 votes

Un code d'état HTTP de 0 a-t-il une signification?

Il semble que lorsque vous faites un XMLHttpRequest à partir d'un script dans un navigateur, si le navigateur est configuré pour travailler hors connexion ou si le câble réseau est retiré, la demande se termine avec un message d'erreur et d'état = 0. 0 n'est pas répertorié parmi autorisée des codes d'état HTTP.

Queest-ce qu'un code d'état de 0 signifie? Signifie-t-il la même chose sur tous les navigateurs, et pour tous les client HTTP utilitaires? Fait-il partie de la spécification HTTP, ou fait-il partie d'un protocole spec? Il semble signifier que la requête HTTP n'a pas pu être faite à tous, peut-être parce que l'adresse du serveur n'a pas pu être résolu.

Ce message d'erreur est approprié de montrer à l'utilisateur? "Soit vous n'êtes pas connecté à internet, ou le site web rencontre des problèmes, ou il y a peut être une erreur de frappe dans l'adresse"?

Je dois ajouter à ce que je vois le comportement de FireFox lorsque réglé sur "Travailler Hors connexion", mais pas dans Microsoft Internet Explorer lorsque réglé sur "Travailler Hors connexion". Dans IE, l'utilisateur obtient une boîte de dialogue donnant la possibilité d'aller en ligne. FireFox ne communique pas à l'utilisateur avant de retourner l'erreur.

Je suis demander ce, en réponse à une demande de "montrer un meilleur message d'erreur". Ce qu'Internet Explorer est bon. Il indique à l'utilisateur ce qui est à l'origine du problème et leur donne la possibilité de le fixer. Afin de donner un équivalent UX avec FireFox j'ai besoin d'en déduire la cause du problème et à en informer l'utilisateur. De sorte qu'au total, puis-je déduire de Statut 0? A-t-elle un sens universel ou ne rien dire?

182voto

Mark Amery Points 4705

Réponse Courte

C'est pas un code de réponse HTTP, mais il est documenté par W3 comme une valeur valide pour l' status attribut d'un XMLHttpRequest.

Il couvre tout un éventail de situations possibles dans lesquelles il n'existe pas de code de réponse HTTP à la disposition du rapport, soit parce que vous n'avez pas envoyé la demande, vous explicitement abandonnée, la page est en cours de déchargement, ou x est allé de mal pour l'une des nombreuses valeurs possibles de x.

Réponse Longue

Tout d'abord, à rappeler: 0 n'est pas un code d'état HTTP. Il y a une liste complète dans la RFC 7231 de l'Article 6.1, qui ne contient pas 0, et l'intro de l'article 6 stipule clairement que

L'état-code est un des trois chiffres du code d'entier

qui 0 ne l'est pas.

Toutefois, la valeur 0 comme valeur de l' status attribut d'un XMLHttpRequest objet est documenté. À partir de la documentation à http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute:

4.7.1 L'attribut état

L' status de l'attribut doit retourner le résultat de l'exécution de ces étapes:

  1. Si l'état est non ENVOYÉS ou OUVERT, retourne 0.

  2. Si l'indicateur d'erreur est défini, retourne 0.

  3. Retourner le code d'état HTTP.

On peut creuser plus profondément dans la spec et découvrez ce que ces conditions de retour 0 moyenne. À partir de http://www.w3.org/TR/XMLHttpRequest/#states:

UNSENT (valeur numérique 0)

L'objet a été construit.

OPENED (valeur numérique 1)

L' open() méthode a été invoquée avec succès. Au cours de cet état-têtes de la requête peut être défini à l'aide de setRequestHeader() et la demande peut être faite à l'aide de l' send() méthode.

...

L' indicateur d'erreur indique un certain type d'erreur de réseau ou chercher de la résiliation. Il est initialement vide.

Il est également pertinent de noter que le prochain état possible après l' UNSENT et OPENED est HEADERS_RECEIVED:

HEADERS_RECEIVED (valeur numérique 2)

Tous les redirections (le cas échéant) ont été suivies et tous les en-têtes HTTP de la réponse définitive n'a été reçue. Plusieurs membres de l'intervention de l'objet sont maintenant disponibles.

Mettre tous ensemble, la réponse courte est que 0 est simplement ce qui est retourné par l' status attribut d'un XMLHttpRequest objet quand il n'y a pas de véritable statut code de retour, parce que soit:

  • La demande n'a pas encore été envoyé, ou
  • La demande a été envoyée, mais les en-têtes de la réponse ont pas encore été reçu, ou
  • Une des nombreuses circonstances, répertoriés dans la documentation, qui ont provoqué l'erreur "drapeau" pour être ensemble.

D'accord, mais quelles erreurs peuvent provoquer ce mystérieux "indicateur d'erreur"? Si vous appuyez sur CTRL-F pour 'indicateur d'erreur" dans le W3 documentation, vous trouverez que c'est de désactiver l'envoi de la demande, et il ne se fait jamais ensemble dans le cadre de l'algorithme à "mettre fin à la demande". Recherche pour tous les endroits que l'algorithme est appelé, vous trouverez qu'il se passe lorsque:

  • La demande est ouvert (ou re-ouvert) avec l' open() méthode
  • La demande est à ordures collectées (par exemple, au moment de quitter la page)
  • La demande est abandonnée avec l' abort() méthode
  • Une demande d'erreur qui se produit, qui peut se produire lorsque l'une des situations suivantes se produit:

    • Une erreur réseau se produit, qui peut se produire si

      • Il y a une infinité de boucle de redirection
      • Il y a

        Les erreurs DNS, TLS échec de la négociation, ou d'un autre type d'erreur de réseau

      • La demande était de la SCRO demande, et la réponse ne peut pas être partagé
    • Une erreur d'abandon se produit, ce qui ne peut se faire que si

      L'utilisateur annule la demande

      quoi que cela signifie. Je ne sais pas du tout navigateur qui affiche les utilisateurs lorsque les requêtes AJAX sont en cours et leur donne la possibilité de les annuler explicitement, donc je pense que celui-ci est - au moins, aujourd'hui pertinente.

    • Une erreur de dépassement de délai se produit, ce qui signifie, assez raisonnablement, que

      timeout n'est pas 0 et puisque la demande a commencé le montant de millisecondes spécifié par timeout a passé

"XMLHttpRequest" va, c'est tout.

Au-delà de XMLHttpRequest, je pourrais dire que HTTP bibliothèques dans des langues en dehors de JavaScript peut bien être l'aide d'un 0 code d'état de la même façon, en tant que valeur par défaut lorsqu'aucun code d'état a été reçu par le serveur.

56voto

mnk Points 658

le statut 0 apparaît lorsqu'un appel ajax a été annulé avant d'obtenir la réponse en actualisant la page ou en demandant une URL inaccessible.

cet état n'est pas documenté mais existe sur les appels ajax et makeRequest de gadget.io.

6voto

David Thomas Points 111253

Pour autant que je sache , cela ne semble pas être défini:

  1. 1xx - Réponses informatives,
  2. 2xx - succès
  3. 3xx - Redirection
  4. 4xx - Erreur du client
  5. 5xx - Erreur du serveur

Sur la base de spéculations pures, potentiellement folles, un code d’état de 0 pourrait-il être une réponse booléenne de votre appel de fonction?

5voto

Loki Points 64

from docuemntation http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute signifie qu'une demande a été annulée avant d'aller ailleurs

0voto

Hanny Points 51

J'ai juste rencontré un zéro code de réponse lors de l'écriture de code pour un servlet java. Lorsqu'un utilisateur tente d'ouvrir une session et ils sont non autorisée, une réponse 401 code est envoyé avec un message d'erreur. Mais rien n'est envoyé. Quand j'ai changé le code de réponse de 200 ou de 500, tout fonctionne bien. Il semble que-tête WWW-Authenticate doit être inclus dans une réponse 401.

Juste pour ajouter que je ne suis pas sûr si le serveur a refusé d'envoyer les en-têtes et le corps de la réponse ou si les appareils iOS ont refusé d'accepter une réponse 401 sans-tête WWW-Authenticate.

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