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 0
z 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ć?
źródło
Odpowiedzi:
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.
źródło
Kod stanu równy 0 w
NSHTTPURLResponse
obiekcie 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
NSError
obiekcie, a nie wNSHTTPURLResponse
.Z
408
mojego 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 z408
kodem statusu, mówiąc klientowi „zajęło ci to zbyt dużo czasu”.źródło
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
źródło
W zestawie SDK systemu iOS Gdy przekroczą limit czasu wywołania interfejsu API, otrzymasz za to status 0.
źródło
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:chodzi o to, że
status: 0
jest nieco ogólna i może być więcej przypadków użycia, które wyzwalają pustą treść odpowiedzi.źródło
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
źródło
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.
źródło
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:
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.
źródło
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:
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ę.
źródło
CORS w moim przypadku.
Taką odpowiedź miałem kiedyś w aplikacji na iOS. Rozwiązaniem był brak
Access-Control-Allow-Origin: *
w nagłówkach.Więcej: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
źródło
Może się to zdarzyć w przypadku odpowiedzi HTTP 401 w przypadku korzystania z NSURLConnection.
Zobacz NSURLConnection zwracający błąd zamiast odpowiedzi dla 401
źródło
Po przekroczeniu limitu czasu przez bramę stan będzie wynosił zero po oddzwonieniu po błędzie.
Kody stanu HTTP
źródło