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?
quelle
Antworten:
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:
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
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 mag leer und tautologisch klingen, aber in Wirklichkeit gibt es hier Informationen! Denken Sie daran, dass in dieser Dokumentation hier über das
.response
AttributXMLHttpRequest
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:
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:
open()
Methode heißt odersend()
Verfahren )abort()
Methode wird aufgerufen, wodurch die Anforderungsfehlerschritte ausgeführt werdenUm 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:
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:
(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:
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.
quelle
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.
quelle
Aus der Dokumentation http://www.w3.org/TR/XMLHttpRequest/#the-status-attribute geht hervor, dass eine Anfrage abgebrochen wurde, bevor sie irgendwohin ging
quelle
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 ):
quelle
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.
quelle
Ja, wie der Ajax-Anruf abgebrochen wurde. Die Ursache kann folgende sein.
quelle