Kurze Antwort
Es ist kein HTTP-Antwortcode, aber er wird von WhatWG als gültiger Wert für das Statusattribut einer XMLHttpRequest
oder 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 .status
Attributs 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 .status
Attribut, in dem einfach Folgendes angegeben ist:
Das status
Attribut 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 .response
Attribut XMLHttpRequest
einer 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 XMLHttpRequest
hat 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:
Zu einem Netzwerkfehler, wenn:
Um die Antwort erzeugte durch Senden der Anforderung unter Verwendung von Fetch haft entweder die Fetch Prozessantwort Aufgabe (falls die XHR Anforderung asychronous) oder der Fetch Prozessantwort end-of-body - Task (wenn die Anforderung XHR ist synchron).
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.