O que significa quando chamadas de rede JavaScript, como busca ou XMLHttpRequest, ou qualquer outro tipo de solicitação de rede HTTP, falham com um código de status HTTP 0?
Este não parece ser um código de status HTTP válido, pois outros códigos têm três dígitos na especificação HTTP.
Tentei desconectar completamente a rede como teste. Pode não estar relacionado, mas isso resultou no código de status 17003 (IIRC), que a pesquisa superficial sugere que significa "Falha na pesquisa do servidor DNS".
O mesmo código funciona bem em alguns locais e sistemas, no entanto, em certos ambientes, falha com o código de status 0 e não é fornecido o responseText.
Este é um HTTP POST típico para um URL da Internet. Ele não envolve file: //, que eu entendo pode retornar 0, indicando sucesso no Firefox.
fonte
banner
Respostas:
Acredito que o código de erro indica que a resposta estava vazia (como nem mesmo os cabeçalhos foram retornados). Isso significa que a conexão foi aceita e depois fechada normalmente (TCP FIN). Há várias coisas que podem causar isso, mas, com base na sua descrição, alguma forma de firewall parece ser a culpada mais provável.
fonte
banner
Muitas das respostas aqui estão erradas. Parece que as pessoas descobrem o que estava causando o status == 0 no seu caso particular e depois generalizam isso como a resposta.
Na prática, o status == 0 para um XmlHttpRequest com falha deve ser considerado um erro indefinido.
A especificação real do W3C define as condições para as quais o zero é retornado aqui: https://fetch.spec.whatwg.org/#concept-network-error
Como você pode ver na especificação (busca ou XmlHttpRequest), esse código pode ser o resultado de um erro que ocorreu mesmo antes do contato do servidor.
Algumas das situações comuns que produzem esse código de status são refletidas nas outras respostas, mas pode haver algum ou nenhum destes problemas:
O que seria útil seria que os navegadores fornecessem relatórios detalhados de erros para mais desses cenários de status == 0. De fato, algumas vezes status == 0 acompanhará uma mensagem útil do console, mas em outras não há outras informações.
fonte
http
vez dehttps
se sua página foi carregada inicialmentehttp
e vice-versa. Outras palavras não executam ajaxPOST
viahttps
se sua página foi acessada viahttp
e não executam ajaxPOST
viahttp
se sua página foi acessada inicialmente viahttps
.Quanto vale a pena, dependendo do navegador, as chamadas AJAX baseadas em jQuery chamarão seu retorno de sucesso com um código de status HTTP igual a 0. Encontramos um código de status "0" geralmente significa que o usuário navegou para uma página diferente antes a chamada AJAX foi concluída.
Não é a mesma pilha de tecnologia que você está usando, mas espero que seja útil para alguém.
fonte
wininet.dll
retorna códigos de status padrão e não padrão listados abaixo.Para o código de status "zero", você está tentando fazer uma solicitação em uma página da Web local em execução em um servidor da Web ou sem um servidor da Web?
XMLHttpRequest status = 0 e XMLHttpRequest statusText = unknown podem ajudá-lo se você não estiver executando seu script em um servidor da web.
fonte
Solução alternativa: o que acabamos fazendo
Nós achamos que isso tinha a ver com problemas de firewall e, por isso, criamos uma solução alternativa que fazia o truque. Se alguém tiver esse mesmo problema, eis o que fizemos:
Ainda gravamos os dados em um arquivo de texto no disco rígido local, como fizemos anteriormente, usando um HTA.
Quando o usuário clica em "enviar dados de volta ao servidor", o HTA lê os dados e grava uma página HTML que os inclui como uma ilha de dados XML (na verdade, usando um bloco de script SCRIPT LANGUAGE = XML).
O HTA lança um link para a página HTML no navegador.
A página HTML agora contém o javascript que lança os dados no servidor (usando Microsoft.XMLHTTP).
Espero que isso ajude qualquer pessoa com um requisito semelhante. Nesse caso, era um jogo em Flash usado em um laptop em feiras. Nunca tivemos acesso ao laptop e só podíamos enviá-lo por e-mail ao cliente, pois essa feira acontecia em outro país.
fonte
Um código de resposta HTTP 0 indica que a solicitação AJAX foi cancelada.
Isso pode acontecer a partir de um tempo limite, aborto por XHR ou um firewall bloqueando a solicitação. Um tempo limite é comum, significa que a solicitação falhou ao executar dentro de um tempo especificado. Um aborto XHR é muito simples de executar ... você pode realmente chamar .abort () em um objeto XMLHttpRequest para cancelar a chamada AJAX. ( Essa é uma boa prática para um aplicativo de página única, se você não quiser que as chamadas AJAX retornem e tentem fazer referência a objetos que foram destruídos. ) Como mencionado na resposta marcada, um firewall também seria capaz de cancelar a solicitação e acionar esta solicitação. 0 resposta.
Anulação de XHR: Anulação de solicitações de Ajax usando jQuery
Vale ressaltar que a execução do método .abort () em um objeto XHR também acionará o retorno de chamada de erro. Se você estiver executando algum tipo de tratamento de erro que analise esses objetos, notará rapidamente que um XHR abortado e um XHR de tempo limite são idênticos, mas com jQuery o textStatus passado para o retorno de chamada de erro será "abortado" quando abortado. e "timeout" com um timeout ocorre. Se você estiver usando o Zepto (muito parecido com o jQuery), o errorType será "error" quando abortado e "timeout" quando ocorrer um timeout.
fonte
Conforme detalhado por esta resposta nesta página , um código de status 0 significa que a solicitação falhou por algum motivo e uma biblioteca javascript interpretou a falha como um código de status 0.
Para testar isso, você pode fazer o seguinte:
1) Use esta extensão do Chrome, Requestly para redirecionar sua URL da
https
versão para ahttp
versão, pois isso causará um erro de segurança de conteúdo misto e, finalmente, gerará um código de status igual a 0. A vantagem dessa abordagem é que você não é necessário alterar seu aplicativo e você pode simplesmente "reescrever" seu URL usando esta extensão.2) Altere o código do seu aplicativo para opcionalmente redirecionar o terminal para a
http
versão do seu URL em vez dahttps
versão (ou vice-versa). Se você fizer isso, a solicitação falhará com o código de status 0.fonte
No meu caso, o status se tornou 0 quando eu esqueci de colocar a WWW na frente do meu domínio. Como todas as minhas solicitações de ajax foram codificadas em http: /WWW.mydomain.com e a página carregada seria apenas http://mydomain.com , tornou-se um problema de segurança porque é um domínio diferente. Acabei fazendo um redirecionamento no meu arquivo .htaccess para sempre colocar www na frente.
fonte
No meu caso, foi porque a chamada AJAX estava sendo bloqueada pelo navegador devido à política de mesma origem . Era a coisa menos esperada, porque todos os meus HTMLs e scripts eram servidos
127.0.0.1
. Como eles podem ser considerados como tendo origens diferentes?De qualquer forma, a causa raiz era uma
<base>
tag de aparência inocente :Eu removi a
<base>
tag, da qual não precisava, e agora funciona bem!fonte
Encontrei um motivo novo e não documentado para o status == 0. Aqui está o que eu tinha:
Não era de origem cruzada, de rede ou devido a solicitações canceladas (por código ou pela navegação do usuário). Nada no console do desenvolvedor ou no log da rede.
Eu pude encontrar muito pouca documentação sobre state () (a Mozilla não a lista, o W3C) e nenhuma delas mencionou "rejeitada".
Acontece que era meu bloqueador de anúncios (uBlock Origin no Firefox).
fonte
Além da resposta de Lee , você pode encontrar mais informações sobre a causa real, alternando para solicitações síncronas , pois também terá uma exceção:
Por exemplo :
fonte
No caso de alguém encontrar esse problema, isso estava me causando problemas devido à solicitação AJAX e a uma solicitação de formulário normal sendo enviada. Eu o resolvi com a seguinte linha:
A chave lá é o retorno false, que faz com que o formulário não seja enviado. Você também pode retornar false de dentro de submitfunc (), mas acho explicitamente escrevê-lo para ser mais claro.
fonte
Note-se que um upload de arquivo ajax que excede a
client_max_body_size
diretiva para nginx retornará esse código de erro.fonte
Se você estiver testando no PC local, ele não funcionará. Para testar o exemplo do Ajax, você precisa colocar os arquivos HTML em um servidor web.
fonte
No meu caso, o erro ocorreu em uma página solicitada com protocolo HTTP, com um Javascript dentro dele tentando fazer uma solicitação HTTPS. E vice versa.
Após o carregamento da página, pressione F12 (ou Ctrl + U) e veja o código HTML da sua página. Se você vir algo assim no seu código:
E sua página foi solicitada desta maneira:
Você certamente enfrentará esse erro.
Para corrigi-lo, defina o protocolo da solicitação Javascript igual ao protocolo da solicitação da página.
Essa situação envolvendo protocolos diferentes, para solicitações de páginas e js, foi mencionada anteriormente na resposta de Brad Parks , mas acho que a técnica de diagnóstico apresentada aqui é mais fácil para a maioria dos usuários.
fonte