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?

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.


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)

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="">


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.


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.


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.


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.


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. :)


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!


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.


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.


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.


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.


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.


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.


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'.


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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.