Я работаю над проектом iOS.
В этом приложении я загружаю изображения с сервера.
Проблема:
При загрузке изображений я получаю время ожидания запроса . Согласно документации HTTP-код статуса тайм-аута запроса 408
.
Но в моем приложении я получаю код состояния HTTP 0
со следующей ошибкой
Ошибка домена = NSURLErrorDomain Code = -1001 «Истекло время ожидания запроса». UserInfo = 0xb9af710 {NSErrorFailingURLStringKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSErrorFailingURLKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg outcription = The NSLocalized requestData ., NSUnderlyingError = 0x13846870 "Время ожидания запроса истекло."}
Во время поиска в Интернете я не нашел информации о коде состояния HTTP 0.
Кто-нибудь может мне это объяснить?
источник
Ответы:
Код состояния HTTP отсутствует. Вы видите 0, возвращаемый API / библиотекой, которую вы используете. Для этого вам нужно будет проверить документацию.
источник
Код состояния 0 в
NSHTTPURLResponse
объекте обычно означает, что ответа не было, и может возникнуть по разным причинам. Сервер никогда не вернет статус 0, поскольку это недопустимый код статуса HTTP.В вашем случае вы появляетесь получаете код состояния 0, потому что время ожидания запроса истекло, а 0 - это просто значение по умолчанию для свойства. Сам тайм-аут может быть по разным причинам, например, сервер просто не отвечает вовремя, блокируется брандмауэром или все ваше сетевое соединение не работает. Обычно в последнем случае телефон достаточно умен, чтобы знать, что у него нет сетевого подключения, и он немедленно выйдет из строя. Однако он все равно не сработает с очевидным кодом состояния 0.
Обратите внимание, что в случаях, когда код состояния равен 0, настоящая ошибка фиксируется в возвращаемом
NSError
объекте, а не в файлеNSHTTPURLResponse
.По
408
моему опыту, статус HTTP встречается довольно редко. Сам никогда не встречал. Но он, по-видимому, используется в тех случаях, когда клиенту необходимо поддерживать активное соединение сокета с сервером, и сервер ожидает, что клиент отправит больше данных через открытый сокет, но этого не происходит в течение заданного промежутка времени и сервер завершает соединение с помощью408
кода состояния, по сути говоря клиенту, что «у вас слишком много времени».источник
Ответ был пустым. В большинстве случаев коды будут иметь значения 1xx, 2xx, 3xx, 4xx, 5xx.
Список кодов состояния HTTP
источник
В iOS SDK. Когда ваш API вызывает тайм-аут, вы получаете для этого статус 0.
источник
Исходя из моего ограниченного опыта, я бы сказал, что следующие два сценария могут вызвать реакцию
status code: 0
, имейте в виду; их могло быть и больше, но я знаю этих двоих:Дело в том, что
status: 0
это немного общий характер, и их может быть больше вариантов использования, которые вызывают пустое тело ответа.источник
Код состояния «0» может появиться по трем причинам:
1) Клиент не может подключиться к серверу
2) Клиент не может получить ответ в течение периода ожидания
3) Запрос был «остановлен (прерван)» Клиентом.
Но эти три причины не стандартизированы
источник
HTTP-ответ 0 не является стандартным HTTP-ответом. Но это указывает на то, что клиент не может подключиться к серверу и, следовательно, истекло время ожидания.
источник
Мы получили ошибку:
GET http: //localhost/pathToWebSite/somePage.aspx вызвал ошибку http.status: 0
Этот вызов выполняется из задачи Windows, которая вызывает файл VBS, поэтому для устранения проблемы мы указали браузер на URL-адрес, и мы получили ошибку конфиденциальности:
Это связано с тем, что у нас есть правило перезаписи URL-адресов IIS, которое заставляет соединения использовать https. Это правило перенаправляет http: // localhost на https: // localhost, но наш сертификат SSL основан на внешнем доменном имени, а не на localhost, поэтому ошибка сообщается как код состояния 0. Таким образом, ошибка конфиденциальности может быть очень неясной причиной. для этого кода состояния 0.
В нашем случае решением было добавить исключение к правилу для localhost и разрешить http: //localhost/pathToWebSite/somePage.aspx использовать http. Непонятно, да, но я столкнусь с этим в следующем году и теперь найду свой ответ в поиске Google.
источник
Иногда браузер отвечает на обработчик ошибок http с помощью объекта ошибки, для которого установлен статус 0, даже если вы видите статус ошибки 404, 401, 500 и т. Д. В сети.
Это может произойти, если ваше приложение и API находятся в разных доменах - применяется механизм CORS. Согласно CORS для каждого запроса API браузер отправляет два запроса:
В приложении мы обрабатываем ответ об ошибке для «Фактический / исходный запрос», и если «предварительный запрос OPTIONS» завершился неудачно - браузер не предоставляет правильный объект HttpError для обработчика ошибок http. Итак, чтобы получить правильный статус HTTP-ответа - убедитесь, что вы получили успешный предполетный ответ на запрос OPTIONS.
источник
CORS в моем случае.
У меня однажды был такой ответ в приложении для iOS. Решение заключалось в отсутствии
Access-Control-Allow-Origin: *
в заголовках.Подробнее: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
источник
Это может произойти с ответом 401 http при использовании NSURLConnection.
См. NSURLConnection, возвращающий ошибку вместо ответа для 401
источник
По таймауту выхода из шлюза статус будет нулевым при обратном вызове при ошибке.
Коды состояния HTTP
источник