Kod stanu HTTP 0 - Error Domain = NSURLErrorDomain?

94

Pracuję nad projektem iOS.

W tej aplikacji pobieram obrazy z serwera.

Problem:

Podczas pobierania obrazów otrzymuję limit czasu żądania . Zgodnie z dokumentacją kod statusu HTTP przekroczenia limitu czasu żądania to 408.

Ale w mojej aplikacji otrzymuję kod stanu HTTP 0z następującym błędem

Error Domain = NSURLErrorDomain Code = -1001 "Przekroczono limit czasu żądania." UserInfo = 0xb9af710 {NSErrorFailingURLStringKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSErrorFailingURLKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSLocalized timedDescription = ., NSUnderlyingError = 0x13846870 "Przekroczono limit czasu żądania."}

Podczas wyszukiwania przez Internet nie znalazłem żadnych informacji o kodzie stanu HTTP 0.

Czy ktoś może mi to wytłumaczyć?

Irfan DUŃSKI
źródło
1
Może również wystąpić z powodu dewelopera treści mieszanych.mozilla.org/en-US/docs/Web/Security/Mixed_content
devasghar

Odpowiedzi:

98

Brak kodu stanu HTTP 0. To, co widzisz, to 0 zwrócone przez API / bibliotekę, której używasz. Będziesz musiał sprawdzić dokumentację tego.

Julian Reschke
źródło
7
IE10 ma dziwny błąd, kiedy otrzymuje kod statusu 401 lub 403, interpretuje go jako kod statusu 0. W mojej głowie kod statusu 0 to błąd, ponieważ najwyraźniej coś jest nie tak.
Gaui
5
Przekroczony limit czasu bramy otrzyma status 0 w wywołaniu zwrotnym błędu http, angulartutorial.net/2017/03/http-status-codes-and-meanings.html
Prashobh
Odpowiedź jest zła. Kod stanu 0 występuje, gdy przeglądarka nie może połączyć się z serwerem. Kiedy otrzymujesz różne błędy, takie jak np. 504, jest to spowodowane ustawieniami odwrotnego proxy.
Nickon
Odpowiedź jest poprawna. Nie ma kodu stanu HTTP 0. Możesz zobaczyć go jako wartość zwracaną z interfejsu API, ale nie pojawi się w komunikacie odpowiedzi HTTP.
Julian Reschke
76

Kod stanu równy 0 w NSHTTPURLResponseobiekcie ogólnie oznacza, że ​​nie było odpowiedzi i może wystąpić z różnych powodów. Serwer nigdy nie zwróci statusu 0, ponieważ nie jest to prawidłowy kod statusu HTTP.

W Twoim przypadku wydaje się, że kod stanu wynosi 0, ponieważ upłynął limit czasu żądania, a 0 to tylko domyślna wartość właściwości. Sam limit czasu może być spowodowany różnymi przyczynami, na przykład po prostu brakiem odpowiedzi serwera na czas, blokowaniem przez zaporę sieciową lub przerwaniem całego połączenia sieciowego. Zwykle w tym drugim przypadku telefon jest na tyle inteligentny, że wie, że nie ma połączenia z siecią i natychmiast zawiedzie. Jednak nadal nie powiedzie się z widocznym kodem stanu 0.

Należy zauważyć, że w przypadkach, gdy kod stanu wynosi 0, rzeczywisty błąd jest przechwytywany w zwracanym NSErrorobiekcie, a nie w NSHTTPURLResponse.

Z 408mojego doświadczenia wynika, że stan HTTP jest dość rzadki. Sam nigdy go nie spotkałem. Ale najwyraźniej jest używany w przypadkach, gdy klient musi utrzymywać aktywne połączenie z serwerem przez gniazdo, a serwer czeka, aby klient wysłał więcej danych przez otwarte gniazdo, ale nie dzieje się to w określonym czasie i serwer kończy połączenie z 408kodem statusu, mówiąc klientowi „zajęło ci to zbyt dużo czasu”.

devios1
źródło
1
Doskonałe wyjaśnienie.
CouchDeveloper
10

Odpowiedź była pusta. W większości przypadków kody będą miały statystyki 1xx, 2xx, 3xx, 4xx, 5xx.

Lista kodów stanu HTTP

VDN
źródło
W podanym łączu nie ma informacji o kodzie stanu HTTP 0.
Irfan DANISH
10

W zestawie SDK systemu iOS Gdy przekroczą limit czasu wywołania interfejsu API, otrzymasz za to status 0.

Ankit Kumar Gupta
źródło
5

Z mojego ograniczonego doświadczenia powiedziałbym, że następujące dwa scenariusze mogą wywołać reakcję status code: 0, pamiętajcie; mogłoby ich być więcej, ale znam tych dwóch:

  • Twoje połączenie może reagować wolno.
  • a może serwer zaplecza nie jest dostępny.

chodzi o to, że status: 0jest nieco ogólna i może być więcej przypadków użycia, które wyzwalają pustą treść odpowiedzi.

Proste rozwiązanie
źródło
To status API, a nie stan HTTP. Jeśli nie było odpowiedzi HTTP, nie było w niej kodu stanu HTTP.
Markiz Lorne
Kod stanu 0 nie oznacza, że ​​istnieje kod odpowiedzi HTTP, ale może to być problem, jeśli serwer jest niedostępny.
Ravi
5

Kod statusu '0' może wystąpić z trzech powodów
1) Klient nie może połączyć się z serwerem
2) Klient nie może otrzymać odpowiedzi w określonym czasie
3) Żądanie zostało "zatrzymane (przerwane)" przez Klienta.

Ale te trzy powody nie są znormalizowane

Hariprasath Yadav
źródło
Czy masz na to jakieś źródło?
rgoliveira
każdy kod źródłowy ma zastosowanie do testowania pierwszych dwóch punktów, potrzebujesz tylko żądania opartego na Ajax. ale trzecie dzieje się po anulowaniu żądania użytkownika, można to zrobić przez przerwanie funkcji w jquery.
Hariprasath Yadav
4

Odpowiedź HTTP 0 nie jest standardową odpowiedzią HTTP. Wskazuje jednak, że klient nie mógł połączyć się z serwerem i dlatego upłynął limit czasu.

shuaib ahmad
źródło
2

Mamy błąd:

GET http: //localhost/pathToWebSite/somePage.aspx zgłosił błąd http.status: 0

To wywołanie jest wykonywane z zadania systemu Windows, które wywołuje plik VBS, więc aby rozwiązać problem, wskazałem przeglądarkę na adres URL i otrzymaliśmy błąd prywatności:

Twoje połączenie nie jest prywatne

Atakujący mogą próbować wykraść Twoje informacje z lokalnego hosta (na przykład hasła, wiadomości lub karty kredytowe). NET :: ERR_CERT_COMMON_NAME_INVALID

Automatycznie zgłaszaj Google szczegółowe informacje o możliwych incydentach związanych z bezpieczeństwem. Polityka prywatności Powrót do bezpieczeństwa Ten serwer nie mógł udowodnić, że jest hostem lokalnym; jego certyfikat bezpieczeństwa pochodzi z * .ourdomain.com. Może to być spowodowane błędną konfiguracją lub przechwyceniem połączenia przez atakującego. Ucz się więcej.

Dzieje się tak, ponieważ mamy ustawioną regułę ponownego zapisywania adresów URL usług IIS, która wymusza używanie protokołu HTTPS przez połączenia. Ta reguła przekierowuje http: // localhost na https: // localhost ale nasz certyfikat SSL jest oparty na zewnętrznej nazwie domeny, a nie na localhost, dlatego błąd, który jest zgłaszany jako kod stanu 0. Więc błąd prywatności może być bardzo niejasnym powodem dla tego kodu stanu 0.

W naszym przypadku rozwiązaniem było dodanie wyjątku do reguły dla localhost i zezwolenie http: //localhost/pathToWebSite/somePage.aspx na używanie http. Niejasne, tak, ale napotkam to w przyszłym roku i teraz znajdę odpowiedź w wyszukiwarce Google.

Jeff Mergler
źródło
2

Czasami przeglądarka odpowiada na procedurę obsługi błędów http z obiektem błędu, który ma status ustawiony na 0, nawet jeśli widzisz status błędu 404, 401, 500 itp. W sieci.

Może się to zdarzyć, jeśli Twoja aplikacja i interfejs API znajdują się w różnych domenach - stosowany jest mechanizm CORS. Według CORS dla każdego żądania API przeglądarka wysyła dwa żądania:

  1. OPCJE inspekcji wstępnej prośba o sprawdzenie, czy API zezwala na żądanie rzeczywistego / pochodzenia.
  2. gdy API pozwala (odpowiedź na żądanie OPTIOS ze statusem 204 i poprawnymi nagłówkami Access-Control-Allow-Origin) - przeglądarka wysyła następne „Żądanie rzeczywiste / pochodzenia”.

W aplikacji obsługujemy odpowiedź Error dla "Actual / Origin request", a jeśli "preflight OPTIONS request" nie powiodło się - przeglądarka nie podaje poprawnego obiektu HttpError dla obsługi błędów http. Aby uzyskać poprawny stan odpowiedzi http - upewnij się, że odpowiedź na żądanie preflight OPCJE powiodła się.

Dmitriy Kusch
źródło
-1

Po przekroczeniu limitu czasu przez bramę stan będzie wynosił zero po oddzwonieniu po błędzie.

.error( function( data,status,headers,config){
    console.log(status) 
 }

Kody stanu HTTP

Prashobh
źródło