Pergunta

O que significa quando a rede JavaScript chama tais como buscar ou XMLHttpRequest, ou qualquer outro tipo de HTTP solicitação de rede, falhar com um código de status HTTP de 0?

Este não parece ser um código de status HTTP válida como outros códigos são três dígitos em HTTP especificação.

Eu tentei desligar a rede completamente como um teste. Pode ser independentes, mas que resultou em código de status 17003 (IIRC), que busca superficial sugere meios "pesquisa servidor DNS falhou".

O mesmo código funciona bem a partir de alguns locais e sistemas, porém dentro de certos ambientes falhar com código de status 0 e não há responseText fornecido.

Este é um típico HTTP POST para uma URL Internet. Não envolve file: // que eu entendo pode retornar 0 indicando sucesso no Firefox.

Foi útil?

Solução

Eu acredito que o código de erro indica que a resposta estava vazio, (como nem mesmo os cabeçalhos foram devolvidos). Isto significa que a ligação foi aceite e, em seguida, fechado graciosamente (TCP FIN). Há uma série de coisas que podem causar isso, mas baseado fora de sua descrição, alguma forma de firewall parece o mais provável culpado.

Outras dicas

Muitas das respostas aqui estão errados. Parece que as pessoas descobrir o que estava causando o status == 0 em seu caso particular e depois generalizar que como a resposta.

Em termos práticos, o status == 0 para um XmlHttpRequest não deve ser considerado um erro indefinido.

A especificação W3C real define as condições para que zero é retornado aqui: https://fetch.spec.whatwg.org/#concept-network-error

Como você pode ver a partir da especificação (buscar ou XmlHttpRequest) este código pode ser o resultado de um erro que aconteceu antes mesmo do servidor é contactado.

Algumas das situações comuns que produzem este código de estado são reflectidos nas outras respostas, mas poderia ser qualquer um ou nenhum destes problemas:

  1. Ilegal solicitação de origem cruzada (ver CORS )
  2. bloco Firewall ou filtrar
  3. O pedido em si foi cancelado em código
  4. Uma instalado extensão do navegador está sujando as coisas

O que seria útil seria para navegadores para fornecer relatórios de erro detalhada para mais destes estatuto == 0 cenários. Na verdade, às vezes o status == 0 irá acompanhar uma útil mensagem console, mas em outros não há nenhuma outra informação.

Por que vale a pena, dependendo do navegador, as chamadas AJAX baseados em jQuery irá chamar seu retorno sucesso com um código de status HTTP 0. Nós encontramos um código de status de "0" geralmente significa que o usuário navegou para uma página diferente antes da chamada AJAX concluída.

Não é o mesmo pilha de tecnologia que você está usando, mas espero que útil para alguém.

wininet.dll retornos ambos os códigos de status padrão e não-padrão que estão listadas abaixo.

401 - Unauthorized file
403 - Forbidden file
404 - File Not Found
500 - some inclusion or functions may missed
200 - Completed

12002 - Server timeout
12029,12030, 12031 - dropped connections (either web server or DB server)
12152 - Connection closed by server.
13030 - StatusText properties are unavailable, and a query attempt throws an exception

Para o código de estado "zero" que você está tentando fazer um pedido em uma página web local executando em um servidor web ou sem um servidor web?

XMLHttpRequest status = 0 e XMLHttpRequest statusText = desconhecido pode ajudá-lo se você não estiver executando o script em um servidor web.

Solução: o que acabamos fazendo

Nós achamos que tinha a ver com problemas de firewall, e assim chegamos a uma solução que fez o truque. Se alguém tem esse mesmo problema, aqui está o que fizemos:

  1. Nós ainda gravar os dados em um arquivo de texto no disco rígido local, como fizemos anteriormente, usando um HTA.

  2. Quando o usuário clica "de volta enviar dados para o servidor", a HTA lê os dados e escreve uma página HTML que inclui esses dados como uma ilha de dados XML (na verdade usando um SCRIPT LANGUAGE = script XML bloco) .

  3. Os lançamentos HTA um link para a página HTML no navegador.

  4. A página HTML contém agora o javascript que as mensagens os dados para o servidor (usando Microsoft.XMLHTTP).

Espero que isso ajude alguém com uma exigência semelhante. Neste caso, foi um jogo em Flash usada em um laptop em feiras. Nós nunca tiveram acesso ao laptop e só poderia enviá-lo para o cliente como a feira estava acontecendo em outro país.

Um código de resposta HTTP de 0 indica que o pedido AJAX foi cancelado.

Isso pode acontecer a partir de um tempo limite, XHR aborto ou um stomping firewall sobre o pedido. Um tempo limite é comum, isso significa que a solicitação falhou ao executar dentro de um prazo especificado. Um XHR aborto é muito simples de fazer ... você pode realmente chamar .abort () em um objeto XMLHttpRequest para cancelar a chamada AJAX. ( Esta é uma boa prática para um único aplicativo página, se você não quer AJAX chama voltando e tentando objetos de referência que foram destruídas. ) Como mencionado na resposta marcada, um firewall também seria capaz de cancelar o pedido e desencadear esta 0 resposta.

XHR Abort: Abort Ajax pede usando jQuery

var xhr = $.ajax({
    type: "POST",
    url: "some.php",
    data: "name=John&location=Boston",
    success: function(msg){
       alert( "Data Saved: " + msg );
    }
});

//kill the request
xhr.abort()

É importante notar que a execução do método .abort () em um objeto XHR também vai acionar o retorno de chamada de erro. Se você estiver fazendo qualquer tipo de erro de manipulação que analisa esses objetos, você vai logo perceber que um XHR abortado e um XHR tempo limite são idênticos, mas com jQuery o textStatus que é passado para a chamada de retorno de erro será "abortar" quando abortado e "tempo de espera" com um tempo limite ocorre. Se você estiver usando Zepto (muito, muito semelhante ao jQuery) a errorType será "erro" quando abortada e "timeout" quando ocorre um tempo limite.

jQuery: error(jqXHR, textStatus, errorThrown);
Zepto:  error(xhr, errorType, error);

Conforme detalhado por esta resposta desta página , um código de status de 0 significa que o pedido falhou por algum motivo, e uma biblioteca javascript interpretou a falhar como um código de status de 0.

Para testar isso, você pode fazer um dos seguintes procedimentos:

1) Use esta extensão Chrome, Requestly para redirecionar o seu url do a versão https do seu url para a versão http, pois isso irá causar um erro de segurança de conteúdo misto, e, finalmente, gerar um código de status de 0. a vantagem dessa abordagem é que você não tem que mudar a sua aplicação a todos, e você pode simplesmente "reescrever" o seu url usando esta extensão.

2) Alterar o código de seu aplicativo para opcionalmente fazer o seu redirecionamento endpoint para a versão http do seu url em vez da versão https (ou vice-versa). Se você fizer isso, a solicitação falhará com código de status 0.

No meu caso a situação se tornou 0 quando eu ia esquecer de colocar a WWW na frente do meu domínio. Porque todos os meus pedidos ajax foram codificado http: /WWW.mydomain.com e a página da Web carregado 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 www sempre colocar na frente.

No meu caso, foi porque a chamada AJAX estava sendo bloqueada pelo navegador por causa da política mesma origem . Foi a coisa menos se espera, porque todos os meus HTMLs e scripts onde a ser servido a partir 127.0.0.1. Como eles poderiam ser considerados como tendo origens diferentes?

De qualquer forma, a causa raiz foi uma tag <base> de aparência inocente:

<base href='<%=request.getScheme()%>://<%=request.getServerName() + ":" + request.getServerPort() + request.getContextPath()%>/'/>

Eu removi a tag <base>, que eu não precisava de pelo caminho, e agora ele funciona muito bem!

Eu encontrei um novo e não documentada razão para o status == 0. Aqui está o que eu tinha:

XMLHttpRequest.status === 0
XMLHttpRequest.readyState === 0
XMLHttpRequest.responseText === ''
XMLHttpRequest.state() === 'rejected'

Não era de origem cruzada, rede, ou devido a pedidos cancelados (por código ou por navegação do usuário). Nada no log do console do desenvolvedor ou rede.

eu poderia encontrar muito pouca documentação sobre o estado () (Mozilla não listá-lo, W3C faz) e nenhum deles mencionou "rejeitado".

Acontece que ele era a minha Ad Blocker (uBlock Origem no Firefox).

Além de Lee resposta , você pode encontrar mais informações sobre a causa real por mudar para solicitações síncronos, como você vai ter também uma exceção:

function request(url) {
    var request = new XMLHttpRequest();
    try {
        request.open('GET', url, false);
        request.send(null);
    } catch (e) {
        console.log(url + ': ' + e);
    }
}

Por exemplo:

NetworkError: Ocorreu um erro A rede

.

Em caso de alguém se depara com este problema, este estava me dando problemas devido ao pedido de AJAX e uma solicitação de forma normal a ser enviado. Eu resolvi-lo com a seguinte linha:

<form onsubmit="submitfunc(); return false;">

A chave não é a falsa retorno, que faz com que o formulário não enviar. Você também pode apenas retornar false de dentro de submitfunc (), mas eu acho explicitamente escrevê-lo para ser mais claro.

Deve-se notar que um upload de arquivos ajax superior a directiva client_max_body_size para nginx irá retornar este código de erro.

Se você estiver testando no PC local, não vai funcionar. Para teste Ajax exemplo, você precisa colocar os arquivos HTML em um servidor web.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top