Por que o AJAX está retornando o código de status HTTP 0?

139

Por alguma razão, ao usar o AJAX (com o meu aplicativo desenvolvido) o navegador apenas para de carregar e retorna os códigos de status de 0. Por que isso acontece?

Tarnfeld
fonte

Respostas:

110

Outro caso:

Pode ser possível obter um código de status de 0se você enviou uma chamada AJAX e uma atualização do navegador foi acionada antes de obter a resposta AJAX . A chamada AJAX será cancelada e você obterá esse status.

mnk
fonte
9
Obrigado por apontar isso, me levou a perceber que (assim como uma atualização do navegador) um envio de formulário pode cancelar a chamada ajax.
Magnus Smith
1
Just do<form onsubmit="return false;">
Heitor
1
A sugestão de @ Heitor funcionou para mim - o botão "enviar" do meu formulário estava atualizando a página. Enquanto isso, o javascript tentava executar uma chamada ajax quando o botão "enviar" era clicado. O resultado foi que a chamada ajax foi cancelada #
Nic Scozzaro
Ei, eu perdi ume.preventDefault();
SparK
97

Na minha experiência, você verá um status 0 quando:

  • executando scripts entre sites (onde o acesso é negado)
  • solicitando um URL inacessível (erro de digitação, problemas de DNS etc.)
  • caso contrário, a solicitação é interceptada (verifique seu bloqueador de anúncios)
  • como acima, se a solicitação for interrompida (o navegador sai da página)
Langdon
fonte
1
Estou recebendo quando a conexão é recusada. Por exemplo, ao depurar meu site com o Visual Studio, se eu parei a sessão de depuração, qualquer solicitação que tentou se conectar será net :: ERR_CONNECTION_REFUSED e o código de status será zero. Isso faz sentido, pois você não pode ter um código de status se não puder se conectar ao servidor que deveria estar fornecendo um.
Triynko
Eu posso confirmar. Eu tenho status == 0 depois de desligar meu servidor web.
9ilsdx 9rvj 0lo
tenho erros devido a 'scripts entre sites'; O que devo fazer?
1
@nasimjahednia pesquisa CORS ... o servidor que você está tentando acessar precisa permitir scripts entre sites do seu domínio.
Langdon
Estou confuso. Não há como recuperar o código de erro HTTP? Este é um monte de casos diferentes aqui (415, 404, etc?)
Edwin Evans
8

Mesmo problema aqui ao usar <button onclick="">submit</button>. Em seguida, resolvido usando<input type="button" onclick="">

Rafi
fonte
1
Bingo!! Alguém pode explicar por que isso?
Jorge
3
Por padrão, o tipo de botão HTML é 'submit'; portanto, clicar nele tentará enviar os dados do formulário. Portanto, ele executará a ação de clique e tentará enviar. Se você usar o tipo 'button', ele não será mais o tipo padrão e executará apenas o clique.
Christophe Roussy
7

O código de status 0 significa que o URL solicitado não está acessível. Alterando http: // algo / algo para https: // algo / algo funcionou para mim. O IE gera um erro dizendo "permissão negada" quando o código de status é 0, outros navegadores não.

Jagadeesh
fonte
Nesse caso, o chrome atualmente deixará a solicitação no estado "Parado" até o tempo limite. Pode ser causado por um sinalizador Strict-Transport-Security retornado em uma solicitação anterior desse servidor ou pode ser um sinalizador Secure / HttpOnly em um cookie enviado com a solicitação.
Shane Hughes
7

É importante observar que as chamadas ajax podem falhar mesmo dentro de uma sessão definida por um cookie com um determinado domínio prefixado com www. Quando você chama seu script php, por exemplo, sem o www. prefixo no URL, a chamada falhará e vice-versa também.

nuxxxx
fonte
4

Este artigo me ajudou. Eu estava enviando um formulário via AJAX e esqueci de usá-lo return false(após minha solicitação de ajax), o que levou ao envio clássico de formulários, mas estranhamente não foi concluído.

Martin Vseticka
fonte
Amanhecer Eu odeio o fato de ter sido pego por este novamente! <form onsubmit="return false;">fez o truque.
Heitor
3

Como isso aparece quando você google ajax status 0, eu queria deixar uma dica que me levou horas perdidas ... Eu estava usando o ajax para chamar um serviço PHP que por acaso era o REST_Controller do Phil para Codeigniter de Phil (não tenho certeza se isso ocorreu) nada a ver com isso ou não) e continuou recebendo o status 0, readystate 0 e isso estava me deixando louco. Eu estava depurando e notei quando ecoaria e retornaria, em vez de sair da mensagem de que eu teria sucesso. Finalmente, desliguei a depuração e tentei e funcionou. Parece que o depurador xDebug com PHP estava de alguma forma modificando a resposta. Se você estiver usando um depurador PHP, tente desligá-lo para ver se isso ajuda.

Michael
fonte
3

Encontrei outro caso em que jquery fornece o código de status 0 - se, por algum motivo, XMLHttpRequest não estiver definido, você receberá esse erro.

Obviamente, isso normalmente não acontece na Web, mas um bug em uma compilação noturna do Firefox causou esse problema em um complemento que eu estava escrevendo. :)

esfomeado
fonte
1
Você fez questão, eu tive um problema com o jQuery.ajax()objeto XHR. O pedido não foi mesmo criado na chamada AJAX, ainda recebendo f.open não é uma função e status código 0. Causada por: eu estava voltando $.ajaxSettings.xhrobjeto $.ajaxSetup({xhr}), retornando new window.XMLHttpRequest();em vez resolvido o problema
klimpond
2

O envio "acidental" de formulários era exatamente o problema que eu estava tendo. Acabei de remover as tags FORM completamente e isso parece resolver o problema. Obrigado a todos!

Insider Pro
fonte
2

Tivemos um problema semelhante - código de status 0 na chamada jquery ajax - e levamos um dia inteiro para diagnosticá-lo. Como ninguém havia mencionado esse motivo ainda, pensei em compartilhar.

No nosso caso, o problema foi o travamento do servidor HTTP. Algum bug no PHP estava soprando o Apache, então no lado do cliente ficou assim:

mirek@toccata:~$ telnet our.server.com 80
Trying 180.153.xxx.xxx...
Connected to our.server.com.
Escape character is '^]'.
GET /test.php HTTP/1.0
Host: our.server.com

Connection closed by foreign host.
mirek@toccata:~$ 

onde test.php continha o código de falha. Nenhum dado retornado do servidor (nem mesmo cabeçalhos) => a chamada ajax foi interrompida com o status 0.

jmper
fonte
2

No meu caso, isso foi causado pela execução do meu servidor django sob o http://127.0.0.1:8000/envio da chamada ajax para http://localhost:8000/. Mesmo que você espere que eles mapeiem para o mesmo endereço, eles não garantem que você não esteja enviando suas solicitações para o host local.

Vlad Schnakovszki
fonte
2

No nosso caso, o link da página foi alterado de https para http . Mesmo que os usuários estivessem logados, eles foram impedidos de carregar com o AJAX.

Andy In NC
fonte
interessante. Espero que seja o meu caso. Desde a minha iframe abre com https e em caso de sucesso resultado I enviar ajax ao http, então eu obter o status 0
sônica
1

No meu caso, definir url: ''configurações de ajax resultaria em um código de status 0 em ie8 .. Parece que ie simplesmente não tolera essa configuração.

blurrcat
fonte
1

Para mim, o problema foi causado pela empresa de hospedagem Godaddy, que tratava as operações do POST que possuíam dados de resposta substanciais (mais do que dezenas de kilobytes) como algum tipo de ameaça à segurança. Se mais de 6 deles ocorreram em um minuto, o host se recusou a executar o código PHP que respondeu à solicitação POST durante o próximo minuto. Não tenho muita certeza do que o host fez, mas vi, com o tcpdump, um pacote de redefinição do TCP como resposta a uma solicitação POST do navegador. Isso fez com que o código de status http retornado em um objeto jqXHR fosse 0.

Alterar as operações de POST para GET corrigiu o problema. Não está claro por que Godaddy impõe esse limite, mas alterar o código foi mais fácil do que alterar o host.

emrys57
fonte
1

Acho que sei o que pode causar esse erro.

No google chrome, há um recurso embutido para impedir ataques de ddos ​​para extensões do google chrome.

Quando solicitações de ajax retornam continuamente mais de 500 erros de status, ele começa a limitar as solicitações.

Portanto, é possível receber o status 0 nas seguintes solicitações.

Anônimo
fonte
1

Na tentativa de ganhar o prêmio pela razão mais idiota do problema descrito.

Esquecendo de ligar

xmlhttp.send(); //yes, you need this pivotal line!

Sim, eu ainda estava recebendo retornos de status zero na chamada 'aberta'.

Gordon Rouse
fonte
1

No meu caso, eu estava conseguindo isso, mas apenas no Safari Mobile. O problema é que eu estava usando o URL completo ( http://example.com/whatever.php ) em vez do relativo (qualquer que seja.php). No entanto, isso não faz sentido, não pode ser um problema de XSS porque meu site está hospedado em http://example.com . Eu acho que o Safari analisa a parte http e a sinaliza automaticamente como uma solicitação insegura sem inspecionar o restante da URL.

Raúl Bojalil
fonte
1

Na minha solução de problemas, achei que este AJAX xmlhttpRequest.status == 0 poderia significar que a chamada do cliente ainda não havia chegado ao servidor, mas falhou devido a um problema no lado do cliente. Se a resposta foi do servidor, o status deve ser o código de resposta HTTP 1xx / 2xx / 3xx / 4xx / 5xx. A partir de agora, a solução de problemas se concentrará no problema do CLIENTE e poderá ser uma conexão de rede da Internet inativa ou uma das descritas por @Langdon acima.

Panini Luncher
fonte
0

Observe o console do navegador enquanto faz a solicitação, se você estiver vendo "A mesma política de origem não permite a leitura do recurso remoto em http ajax ..... motivo: cabeçalho cors 'acesso-controle-permitir-origem' ausente", então você precisa adicione "Access-Control-Allow-Origin" no cabeçalho da resposta. exa: em java, você pode definir isso como response.setHeader ("Access-Control-Allow-Origin", "*") em que response é HttpServletResponse.

Mahadev Mandale
fonte