Krótka odpowiedź
Nie jest to kod odpowiedzi HTTP, ale jest udokumentowany przez WhatWG jako prawidłowa wartość atrybutu statusu odpowiedzi XMLHttpRequest
lub odpowiedzi Fetch.
Mówiąc ogólnie, jest to wartość domyślna używana, gdy nie ma prawdziwego kodu stanu HTTP do zgłoszenia i / lub wystąpił błąd podczas wysyłania żądania lub otrzymywania odpowiedzi. Możliwe scenariusze, w których ma to miejsce, obejmują między innymi:
- Żądanie nie zostało jeszcze wysłane lub zostało przerwane.
- Przeglądarka nadal czeka na stan odpowiedzi i nagłówki.
- Połączenie zostało zerwane podczas żądania.
- Upłynął limit czasu żądania.
- Żądanie napotkało nieskończoną pętlę przekierowań.
- Przeglądarka zna stan odpowiedzi, ale nie masz do niej dostępu ze względu na ograniczenia bezpieczeństwa związane z zasadami tego samego pochodzenia .
Długa odpowiedź
Po pierwsze, powtórzenie: 0 nie jest kodem stanu HTTP. Jest ich pełna lista w RFC 7231 sekcja 6.1 , która nie zawiera 0, a wprowadzenie do sekcji 6 jasno stwierdza, że
Element status-code to trzycyfrowy kod całkowity
które 0 nie jest.
.status
Udokumentowano jednak 0 jako wartość atrybutu obiektu XMLHttpRequest, chociaż wyśledzenie wszystkich istotnych szczegółów jest trochę trudne. Zaczynamy od https://xhr.spec.whatwg.org/#the-status-attribute , dokumentując .status
atrybut, który po prostu stwierdza:
status
Atrybut musi zwrócić Response „s statusu .
Może to brzmieć bezmyślnie i tautologicznie, ale w rzeczywistości są tutaj informacje! Pamiętaj, że ta dokumentacja mówi tutaj o .response
atrybucie an XMLHttpRequest
, a nie odpowiedzi, więc to mówi nam, że definicja stanu obiektu XHR jest odroczona do definicji statusu odpowiedzi w specyfikacji pobierania.
Ale jaki obiekt odpowiedzi? A jeśli tak naprawdę nie otrzymaliśmy jeszcze odpowiedzi? Wbudowany link w słowie „odpowiedź” prowadzi nas do https://xhr.spec.whatwg.org/#response , który wyjaśnia:
An XMLHttpRequest
ma powiązaną odpowiedź. O ile nie zaznaczono inaczej, jest to błąd sieci .
Zatem odpowiedź, której stan otrzymujemy, jest domyślnie błędem sieci. Wyszukując wszędzie tam, gdzie w specyfikacji XHR jest używane wyrażenie „set response to” , możemy zobaczyć, że jest ono ustawione w pięciu miejscach:
Patrząc na standard Fetch , widzimy, że:
Błąd sieci to odpowiedź , której stan jest zawsze0
dzięki czemu możemy od razu stwierdzić, że zobaczymy stan 0 w obiekcie XHR w każdym z przypadków, w których specyfikacja XHR mówi, że odpowiedź powinna być ustawiona na błąd sieci. (Co ciekawe, obejmuje to przypadek, w którym strumień ciała jest „błędny”, co zgodnie ze specyfikacją pobierania może się zdarzyć podczas analizowania treści po otrzymaniu statusu - więc teoretycznie przypuszczam, że obiekt XHR może mieć swój status ustawiony na 200, a następnie napotkasz błąd braku pamięci lub coś innego podczas odbierania treści i zmień jego stan z powrotem na 0.)
W standardzie Fetch zauważamy również, że istnieje kilka innych typów odpowiedzi, których status jest zdefiniowany jako 0, których istnienie odnosi się do żądań między źródłami i zasad tego samego pochodzenia:
Nieprzezroczysta przefiltrowana odpowiedź to przefiltrowana odpowiedź, której ... stan to 0
...
Odfiltrowana odpowiedź nieprzezroczystego przekierowania to przefiltrowana odpowiedź, której ... stan to 0
...
(pominięto różne inne szczegóły dotyczące tych dwóch typów odpowiedzi).
Ale poza tym istnieje również wiele przypadków, w których algorytm pobierania (zamiast specyfikacji XHR, którą już przeglądaliśmy) wzywa przeglądarkę do zwrócenia błędu sieciowego! Rzeczywiście, wyrażenie „zwraca błąd sieci” pojawia się 40 razy w standardzie Fetch. Nie będę próbował tutaj wymieniać wszystkich 40, ale zaznaczam, że są to:
- Sytuacja, w której schemat żądania jest nierozpoznany (np. Próba wysłania żądania na madeupscheme: //foobar.com)
- Cudownie niejasna instrukcja „W razie wątpliwości zwróć błąd sieci”. w algorytmach obsługi adresów URL ftp: // i file: //
- Nieskończone przekierowania: „Jeśli liczba przekierowań żądania wynosi dwadzieścia, zwróć błąd sieci”.
- Kilka problemów związanych z mechanizmem CORS, takich jak „Jeśli zepsucie odpowiedzi httpRequest nie jest„ cors ”, a zasady zasobów między źródłami sprawdzają, czy zwroty żądań i odpowiedzi są zablokowane, a następnie zwraca błąd sieci”.
- Błędy połączenia: „Jeśli połączenie nie powiedzie się, zwróć błąd sieci”.
Innymi słowy: gdy coś pójdzie nie tak inne niż uzyskanie prawdziwy kod stanu HTTP error niczym 500 lub 400 z serwera, możesz skończyć z atrybutem stanu 0 na swoim obiekcie użyciem nagłówków XHR lub Fetch obiekt odpowiedzi w przeglądarce. Liczba możliwych przyczyn określonych w specyfikacji jest ogromna.
Na koniec: jeśli z jakiegoś powodu interesuje Cię historia specyfikacji, zwróć uwagę, że ta odpowiedź została całkowicie przepisana w 2020 r. I że możesz być zainteresowany poprzednią wersją tej odpowiedzi , która przeanalizowała zasadniczo te same wnioski z starsza (i znacznie prostsza) specyfikacja W3 dla XHR, zanim zostały one zastąpione przez bardziej nowoczesne i bardziej skomplikowane specyfikacje WhatWG, do których odnosi się ta odpowiedź.