Hat ein HTTP-Statuscode von 0 eine Bedeutung?

89

Wenn Sie eine XMLHttpRequest aus einem Skript in einem Browser erstellen, der Browser auf Offline eingestellt ist oder das Netzwerkkabel herausgezogen ist, wird die Anforderung anscheinend mit einem Fehler abgeschlossen und mit dem Status = 0. 0 wird nicht unter den zulässigen Werten aufgeführt HTTP-Statuscodes.

Was bedeutet ein Statuscode von 0? Bedeutet dies für alle Browser und für alle HTTP-Client-Dienstprogramme dasselbe? Ist es Teil der HTTP-Spezifikation oder Teil einer anderen Protokollspezifikation? Es scheint zu bedeuten, dass die HTTP-Anforderung überhaupt nicht gestellt werden konnte, möglicherweise weil die Serveradresse nicht aufgelöst werden konnte.

Welche Fehlermeldung ist geeignet, um den Benutzer anzuzeigen? "Entweder sind Sie nicht mit dem Internet verbunden oder auf der Website treten Probleme auf, oder es liegt ein Tippfehler in der Adresse vor"?

Ich sollte hinzufügen, dass ich das Verhalten in FireFox sehe, wenn es auf "Offline arbeiten" eingestellt ist, aber nicht in Microsoft Internet Explorer, wenn es auf "Offline arbeiten" eingestellt ist. Im IE erhält der Benutzer einen Dialog, in dem er online gehen kann. FireFox benachrichtigt den Benutzer nicht, bevor der Fehler zurückgegeben wird.

Ich frage dies als Antwort auf eine Anfrage, "eine bessere Fehlermeldung anzuzeigen". Was Internet Explorer macht, ist gut. Es teilt dem Benutzer mit, was das Problem verursacht, und gibt ihm die Möglichkeit, es zu beheben. Um eine äquivalente UX mit FireFox zu erhalten, muss ich die Ursache des Problems ableiten und den Benutzer informieren. Was kann ich also insgesamt aus Status 0 ableiten? Hat es eine universelle Bedeutung oder sagt es mir nichts?

Mark Lutton
quelle
Bitte lesen
Scott Stafford
3
Ich glaube, dies ist die genaueste Antwort: stackoverflow.com/a/14507670/700206
Whitneyland
Ein weiterer verwandter Beitrag - Was bedeutet HTTP-Statuscode 0
RBT

Antworten:

150

Kurze Antwort

Es ist kein HTTP-Antwortcode, aber er wird von WhatWG als gültiger Wert für das Statusattribut einer XMLHttpRequestoder einer Abrufantwort dokumentiert .

Im Allgemeinen ist dies ein Standardwert, der verwendet wird, wenn kein wirklicher HTTP-Statuscode zu melden ist und / oder ein Fehler beim Senden der Anforderung oder beim Empfangen der Antwort aufgetreten ist. Mögliche Szenarien, in denen dies der Fall ist, umfassen, sind aber nicht beschränkt auf:

  • Die Anfrage wurde noch nicht gesendet oder abgebrochen.
  • Der Browser wartet immer noch auf den Antwortstatus und die Header.
  • Die Verbindung wurde während der Anforderung unterbrochen.
  • Die Anfrage ist abgelaufen.
  • Die Anforderung stieß auf eine Endlosumleitungsschleife.
  • Der Browser kennt den Antwortstatus, aber Sie dürfen aufgrund von Sicherheitsbeschränkungen im Zusammenhang mit der Richtlinie für denselben Ursprung nicht darauf zugreifen .

Lange Antwort

Um es noch einmal zu wiederholen: 0 ist kein HTTP-Statuscode. Es gibt eine vollständige Liste von ihnen in RFC 7231, Abschnitt 6.1 , die keine 0 enthält, und das Intro zu Abschnitt 6 besagt dies deutlich

Das Statuscode-Element ist ein dreistelliger Ganzzahlcode

welche 0 ist nicht.

0 als Wert des .statusAttributs eines XMLHttpRequest-Objekts wird jedoch dokumentiert, obwohl es etwas schwierig ist, alle relevanten Details aufzuspüren. Wir beginnen unter https://xhr.spec.whatwg.org/#the-status-attribute und dokumentieren das .statusAttribut, in dem einfach Folgendes angegeben ist:

Das statusAttribut muss Rückkehr der Antwort ‚s Status .

Das mag leer und tautologisch klingen, aber in Wirklichkeit gibt es hier Informationen! Denken Sie daran, dass in dieser Dokumentation hier über das .responseAttribut XMLHttpRequesteiner Antwort und nicht über eine Antwort gesprochen wird. Daher wird die Definition des Status eines XHR-Objekts auf die Definition des Status einer Antwort in der Abrufspezifikation verschoben.

Aber welches Antwortobjekt? Was ist, wenn wir noch keine Antwort erhalten haben? Der Inline-Link zum Wort "Antwort" führt uns zu https://xhr.spec.whatwg.org/#response , in dem Folgendes erklärt wird:

An XMLHttpRequesthat eine zugehörige Antwort. Sofern nicht anders angegeben, handelt es sich um einen Netzwerkfehler .

Die Antwort, deren Status wir erhalten, ist standardmäßig ein Netzwerkfehler. Und wenn wir überall nach dem Ausdruck "Antwort setzen auf" suchen, der in der XHR-Spezifikation verwendet wird, können wir sehen, dass er an fünf Stellen gesetzt ist:

Wenn wir uns den Fetch-Standard ansehen, können wir Folgendes sehen:

Ein Netzwerkfehler ist eine Antwort, deren Status immer lautet0

So können wir sofort erkennen, dass in einem der Fälle, in denen die XHR-Spezifikation besagt, dass die Antwort auf einen Netzwerkfehler gesetzt werden soll, der Status 0 für ein XHR-Objekt angezeigt wird. (Interessanterweise schließt dies den Fall ein, in dem der Stream des Körpers "fehlerhaft" wird, was laut Fetch-Spezifikation beim Parsen des Körpers nachher auftreten kann des Status auftreten kann. Theoretisch ist es also möglich, dass ein XHR-Objekt seinen Status hat auf 200 gesetzt, dann beim Empfang des Körpers auf einen Speicherfehler oder etwas anderes stoßen und so seinen Status wieder auf 0 ändern.)

Wir stellen im Fetch-Standard auch fest, dass einige andere Antworttypen existieren, deren Status als 0 definiert ist, deren Existenz sich auf Ursprungsübergreifende Anforderungen und die Richtlinie für denselben Ursprung bezieht:

Eine undurchsichtige gefilterte Antwort ist eine gefilterte Antwort, deren ... Status 0...

Eine gefilterte Antwort mit undurchsichtiger Umleitung ist eine gefilterte Antwort, deren ... Status 0...

(Verschiedene andere Details zu diesen beiden Antworttypen wurden weggelassen).

Darüber hinaus gibt es aber auch viele Fälle, in denen der Fetch- Algorithmus (anstelle der XHR-Spezifikation, die wir uns bereits angesehen haben) den Browser auffordert, einen Netzwerkfehler zurückzugeben! In der Tat kommt der Ausdruck "Netzwerkfehler zurückgeben" im Abrufstandard 40 Mal vor . Ich werde nicht versuchen, alle 40 hier aufzulisten, aber ich stelle fest, dass sie Folgendes enthalten:

  • Der Fall, in dem das Schema der Anforderung nicht erkannt wird (z. B. der Versuch, eine Anforderung an madeupscheme zu senden: //foobar.com)
  • Die wunderbar vage Anweisung "Wenn Sie Zweifel haben, geben Sie einen Netzwerkfehler zurück." in den Algorithmen für den Umgang mit FTP: // und Datei: // URLs
  • Unendliche Weiterleitungen: "Wenn die Anzahl der Weiterleitungen der Anforderung zwanzig beträgt, wird ein Netzwerkfehler zurückgegeben."
  • Eine Reihe von CORS-bezogenen Problemen, z. B. "Wenn die Antwortbeschädigung von httpRequest nicht" cors "ist und die Überprüfung der Ressourcenrichtlinien zwischen verschiedenen Ursprüngen mit blockierten Anforderungs- und Antwortrückgaben blockiert ist, wird ein Netzwerkfehler zurückgegeben."
  • Verbindungsfehler: "Wenn die Verbindung fehlschlägt, geben Sie einen Netzwerkfehler zurück."

Mit anderen Worten: wenn etwas schief geht , andere als einen echten HTTP - Fehlerstatuscode wie ein 500 oder 400 vom Server bekommen, beenden Sie mit einem Status - Attribute von 0 auf Ihrem XHR Objekt nach oben oder Response - Objekt im Browser abrufen. Die Anzahl der möglichen spezifischen Ursachen, die in der Spezifikation aufgeführt sind, ist enorm.

Schließlich: Wenn Sie aus irgendeinem Grund an der Geschichte der Spezifikation interessiert sind, beachten Sie, dass diese Antwort im Jahr 2020 vollständig umgeschrieben wurde und dass Sie möglicherweise an der vorherigen Überarbeitung dieser Antwort interessiert sind, bei der im Wesentlichen dieselben Schlussfolgerungen aus der Spezifikation analysiert wurden ältere (und viel einfachere) W3-Spezifikation für XHR, bevor diese durch die moderneren und komplizierteren WhatWG-Spezifikationen ersetzt wurden, auf die sich diese Antworten beziehen.

Mark Amery
quelle
53

Der Status 0 wird angezeigt, wenn ein Ajax-Anruf abgebrochen wurde, bevor die Antwort durch Aktualisieren der Seite oder Anfordern einer nicht erreichbaren URL abgerufen wurde.

Dieser Status ist nicht dokumentiert, existiert jedoch über Ajax- und makeRequest-Aufrufe von gadget.io.

mnk
quelle
4
Hallo, gibt es eine Möglichkeit, zwischen fehlgeschlagener ("Kein Netzwerk") und abgebrochener Anfrage zu unterscheiden?
Ankur
2
Dieser Status wird als XmlHttpRequest-Status dokumentiert. Natürlich ist es kein http-Status, aber es ist dokumentiert. w3.org/TR/XMLHttpRequest/#the-status-attribute Weitere Informationen finden Sie in der Antwort von Mark Amery.
Frédéric
4

Ich weiß, es ist ein alter Beitrag. Diese Probleme bestehen jedoch weiterhin.

Hier sind einige meiner Erkenntnisse zu diesem Thema, die grob erklärt wurden.

"Status" 0 bedeutet eines von drei Dingen gemäß der XMLHttpRequest-Spezifikation:

  • Die Auflösung des DNS-Namens ist fehlgeschlagen (z. B. wenn der Netzwerkstecker gezogen wird).

  • Server hat nicht geantwortet (auch bekannt als nicht erreichbar oder nicht antwortend)

  • Die Anforderung wurde aufgrund eines CORS-Problems abgebrochen (der Abbruch wird vom Benutzeragenten durchgeführt und folgt einem fehlgeschlagenen OPTIONS-Vorflug).

Wenn Sie noch weiter gehen möchten, tauchen Sie tief in die Grundlagen von XMLHttpRequest ein. Ich schlage vor, die Ready-State-Update-Sequenz zu lesen ([0,1,2,3,4] ist die normale Sequenz, [0,1,4] entspricht dem Status 0, [0,1,2,4] bedeutet keinen Inhalt gesendet, was ein Fehler sein kann oder nicht). Möglicherweise möchten Sie auch Listener an das xhr anhängen (onreadystatechange, onabort, onerror, ontimeout), um Details herauszufinden.

Aus der Spezifikation ( XHR Living-Spezifikation ):

const unsigned short UNSENT = 0;
const unsigned short OPENED = 1;
const unsigned short HEADERS_RECEIVED = 2;
const unsigned short LOADING = 3;
const unsigned short DONE = 4;
Obotor
quelle
1
Alle möglichen Ursachen in Ihrer Liste hier sind korrekt, aber Ihre Liste ist nicht vollständig. Zum Beispiel fehlen Ihnen Zeitüberschreitungen, Endlosumleitungsschleifen und andere Ursachen, die in meiner Antwort aufgeführt sind . Der Zeiger auf die neue lebende XHR-Spezifikation ist jedoch nützlich. Ich sollte meine Antwort aktualisieren, um dies anstelle der alten W3-Spezifikation zu zitieren.
Mark Amery
0

Seit iOS 9 müssen Sie Ihrer Datei info.plist "App Transport Security Settings" hinzufügen und "Willkürliche Ladevorgänge zulassen" zulassen, bevor Sie eine Anfrage an einen nicht sicheren HTTP-Webdienst stellen. Ich hatte dieses Problem in einer meiner Apps.

Nirav
quelle
-1

Ja, wie der Ajax-Anruf abgebrochen wurde. Die Ursache kann folgende sein.

  1. Vor Abschluss der Ajax-Anforderung navigierte der Benutzer zu einer anderen Seite.
  2. Ajax-Anfrage hat Zeitüberschreitung.
  3. Der Server kann keine Antwort zurückgeben.
Vinayak
quelle