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 0
com 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?
fonte
Respostas:
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.
fonte
Um código de status de 0 em um
NSHTTPURLResponse
objeto 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
NSError
objeto retornado , não noNSHTTPURLResponse
.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 um408
código de status, essencialmente dizendo ao cliente "você demorou muito".fonte
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
fonte
No iOS SDK, quando sua chamada de API atinge o tempo limite, você obtém o status 0 para isso.
fonte
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:a questão é que
status: 0
é um pouco genérico e poderia haver mais casos de uso que acionam um corpo de resposta vazio.fonte
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
fonte
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.
fonte
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:
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.
fonte
À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:
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.
fonte
CORS no meu caso.
Tive essa resposta em um aplicativo iOS uma vez. A solução estava faltando
Access-Control-Allow-Origin: *
nos cabeçalhos.Mais: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin
fonte
Isso pode acontecer com uma resposta de 401 http se estiver usando NSURLConnection.
Consulte NSURLConnection retornando erro em vez de resposta para 401
fonte
No tempo limite do gate way, o status será zero no retorno de chamada de erro.
Códigos de status HTTP
fonte