Código de status HTTP 0 - Domínio de erro = NSURLErrorDomain?

94

Estou trabalhando em um projeto iOS.

Neste aplicativo, estou baixando imagens do servidor.

Problema:

Ao baixar as imagens, recebo Solicitação de tempo limite . De acordo com a documentação, o código de status HTTP do tempo limite da solicitação é 408.

Mas em meu aplicativo, estou recebendo o código de status HTTP 0com o seguinte erro

Error Domain = NSURLErrorDomain Code = -1001 "A solicitação expirou." UserInfo = 0xb9af710 {NSErrorFailingURLStringKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg , NSErrorFailingURLKey = http://xxxx.com/resources/p/PNG/1383906967_5621_63.jpg esgotado, NSLocalized ., NSUnderlyingError = 0x13846870 "A solicitação expirou."}

Durante uma pesquisa, na Internet, não encontrei nenhuma informação sobre o código de status HTTP 0.

Alguém pode me explicar isso?

Irfan DINAMARCA
fonte

Respostas:

96

Não há nenhum código de status HTTP 0. O que você vê é um 0 retornado pela API / biblioteca que você está usando. Você terá que verificar a documentação para isso.

Julian Reschke
fonte
7
O IE10 tem um bug estranho, ao receber o código de status 401 ou 403, ele o interpreta como código de status 0. Na minha cabeça, o código de status 0 é um erro porque claramente algo está errado.
Gaui
5
O tempo limite do Gate way receberá o status 0 em sua resposta de erro http, angulartutorial.net/2017/03/http-status-codes-and-meanings.html
Prashobh
A resposta está errada. O código de status 0 existe quando o navegador não consegue se conectar ao servidor. Quando você obtém erros diferentes como, por exemplo, 504, isso é causado por configurações de proxy reverso.
Nickon,
A resposta está correta. Não há nenhum código de status HTTP 0. Você pode vê-lo como um valor de retorno de uma API, mas não ocorrerá dentro de uma mensagem de resposta HTTP.
Julian Reschke,
74

Um código de status de 0 em um NSHTTPURLResponseobjeto geralmente significa que não houve resposta e pode ocorrer por vários motivos. O servidor nunca retornará um status 0, pois este não é um código de status HTTP válido.

No seu caso, parece que você está obtendo um código de status 0 porque a solicitação está expirando e 0 é apenas o valor padrão da propriedade. O tempo limite em si pode ser por vários motivos, como o servidor simplesmente não responder a tempo, ser bloqueado por um firewall ou toda a sua conexão de rede estar desligada. Normalmente, neste último caso, o telefone é inteligente o suficiente para saber que não tem uma conexão de rede e falhará imediatamente. No entanto, ele ainda falhará com um código de status aparente de 0.

Observe que nos casos em que o código de status é 0, o erro real é capturado no NSErrorobjeto retornado , não no NSHTTPURLResponse.

O status HTTP 408é bastante incomum em minha experiência. Nunca encontrei um. Mas aparentemente é usado nos casos em que o cliente precisa manter uma conexão de soquete ativa com o servidor, e o servidor está esperando que o cliente envie mais dados pelo soquete aberto, mas não o faz em um determinado período de tempo e o servidor termina a conexão com um 408código de status, essencialmente dizendo ao cliente "você demorou muito".

devios1
fonte
1
Explicação perfeita.
CouchDeveloper de
Esta deve ser a resposta aceita
Cyrus Dsouza
10

A resposta estava vazia. Na maioria dos casos, os códigos serão estatísticas com 1xx, 2xx, 3xx, 4xx, 5xx.

Lista de códigos de status HTTP

VDN
fonte
No link fornecido, não há informações sobre o código de status HTTP 0.
Irfan DINAMARCA
10

No iOS SDK, quando sua chamada de API atinge o tempo limite, você obtém o status 0 para isso.

Ankit Kumar Gupta
fonte
5

De minha experiência limitada, eu diria que os dois cenários a seguir podem causar uma resposta status code: 0, tenha em mente; eles poderiam ser mais, mas eu conheço esses dois:

  • sua conexão pode estar respondendo lentamente.
  • ou talvez o servidor back-end não esteja disponível.

a questão é que status: 0é um pouco genérico e poderia haver mais casos de uso que acionam um corpo de resposta vazio.

Solução Simples
fonte
É um status de API, não um status de HTTP. Se não houve resposta HTTP, não havia nenhum código de status HTTP nele.
Marquês de Lorne
O código de status 0 não significa que haja um código de resposta HTTP, mas pode ser o problema se o seu servidor não estiver disponível.
Ravi de
5

O código de status '0' pode ocorrer por três motivos
1) O cliente não pode se conectar ao servidor
2) O cliente não pode receber a resposta dentro do período de tempo limite
3) A solicitação foi "interrompida (abortada)" pelo cliente.

Mas esses três motivos não são padronizados

Hariprasath Yadav
fonte
Você tem alguma fonte sobre isso?
rgoliveira
qualquer código-fonte é aplicável para testar os dois primeiros pontos, você só precisa de uma solicitação baseada em Ajax. mas o terceiro está acontecendo ao cancelar a solicitação do usuário, isso pode ser feito pela função abort no jquery.
Hariprasath Yadav
4

A resposta HTTP 0 não é a resposta HTTP padrão. Mas indica que o cliente não conseguiu se conectar ao servidor e, portanto, o tempo limite ocorreu.

shuaib ahmad
fonte
2

Encontramos o erro:

OBTER http: //localhost/pathToWebSite/somePage.aspx gerou um erro http.status: 0

Essa chamada é feita a partir de uma tarefa do Windows que chama um arquivo VBS, portanto, para solucionar o problema, apontamos um navegador para a url e obtemos um erro de privacidade:

Sua conexão não é privada

Os invasores podem estar tentando roubar suas informações do host local (por exemplo, senhas, mensagens ou cartões de crédito). NET :: ERR_CERT_COMMON_NAME_INVALID

Comunique automaticamente detalhes de possíveis incidentes de segurança ao Google. Política de privacidade Voltar à segurança Este servidor não conseguiu provar que é localhost; seu certificado de segurança é de * .ourdomain.com. Isso pode ser causado por uma configuração incorreta ou por um invasor interceptando sua conexão. Saber mais.

Isso ocorre porque temos uma regra de regravação de URL do IIS definida para forçar o uso de https nas conexões. Essa regra desvia http: // localhost para https: // localhost, mas nosso certificado SSL é baseado em um nome de domínio externo, não localhost, portanto, o erro que é relatado como código de status 0. Portanto, um erro de privacidade pode ser um motivo muito obscuro para este código de status 0.

Em nosso caso, a solução foi adicionar uma exceção à regra para localhost e permitir que http: //localhost/pathToWebSite/somePage.aspx usasse http. Obscuro, sim, mas vou dar de cara com o ano que vem e agora vou encontrar minha resposta em uma pesquisa no google.

Jeff Mergler
fonte
2

Às vezes, o navegador responde ao manipulador de erro http com o objeto Error, que tem o status definido como 0, mesmo se você puder ver o status de erro 404, 401, 500 etc. na rede.

Isso pode acontecer se seu aplicativo e API estiverem em domínios diferentes - o mecanismo CORS é aplicado. De acordo com o CORS, para cada solicitação de API, o navegador envia duas solicitações:

  1. preflight solicitação OPTIONS para entender se a API permite a solicitação Real / Origem.
  2. quando a API permitir (a solicitação OPTIOS responde com o status 204 e os cabeçalhos Access-Control-Allow-Origin corretos) - o navegador envia a próxima "Solicitação real / origem".

No aplicativo, estamos lidando com a resposta de erro para "Solicitação real / origem" e se "solicitação de OPÇÕES de comprovação" falhou - o navegador não fornece o objeto HttpError correto para o manipulador de erros http. Portanto, para obter o status correto da resposta http - certifique-se de obter a resposta da solicitação OPTIONS de comprovação bem-sucedida.

Dmitriy Kusch
fonte
-1

No tempo limite do gate way, o status será zero no retorno de chamada de erro.

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

Códigos de status HTTP

Prashobh
fonte