XMLHttpRequest status 0 (responseText está vazio)

Não é possível obter dados com XMLHttpRequest (status 0 e responseText está vazio):

 xmlhttp = new XMLHttpRequest ();
 xmlhttp.open ("GET", "http://www.w3schools.com/XML/cd_catalog.xml", true);
 xmlhttp.onreadystatechange = function () 
 {
   if (xmlhttp.readyState == 4)
     alert ("status" + xmlhttp.status);
 }
 xmlhttp.send ();

Ele alerta “status 0”.

A mesma situação com o pedido do host local (cd_catalog.xml é salvo como um arquivo local)

 xmlhttp.open ("GET", "http: //localhost/cd_catalog.xml", true);

Mas com o pedido IP localhost

 xmlhttp.open ("GET", "http://127.0.0.1/cd_catalog.xml", true);

e com o pedido de arquivo local

 xmlhttp.open ("GET", "cd_catalog.xml", true);

está tudo bem (status 200)

O que pode causar o problema (status = 0) com a solicitação on-line?

PS: Live HTTP Headers mostra que está tudo bem em todos os quatro casos:

   HTTP / 1.1 200 OK
   Content-Length: 4742

PS2: Apache servidor web local em VMWare (host OS Win7, convidado OS Ubuntu, adaptador de rede – NAT). Navegador – Firefox.

o status é 0 quando o arquivo html que contém o script é aberto no navegador por meio do esquema de arquivos. Certifique-se de colocar os arquivos em seu servidor (apache ou tomcat qualquer) e, em seguida, abra-o via protocolo http no navegador. (isto é, http: //localhost/myfile.html ) Esta é a solução.

Na verdade, certifique-se de que seu tipo de botão seja Button not Submit, que causou um conflito de status no qual eu me encontrei recentemente.

A causa dos seus problemas é que você está tentando fazer uma chamada entre domínios e ela falha .

Se você está fazendo desenvolvimento localhost, você pode fazer chamadas entre domínios – eu faço isso o tempo todo.

Para o Firefox, você tem que habilitá-lo em suas configurações

 signed.applets.codebase_principal_support = true 

Em seguida, adicione algo como isto ao seu código aberto XHR:

  if (isLocalHost()){ if (typeof(netscape) != 'undefined' && typeof(netscape.security) != 'undefined'){ netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead'); } } 

Para o IE, se bem me lembro, tudo o que você precisa fazer é habilitar a configuração de segurança do navegador em “Diversos → Acessar fonts de dados em todos os domínios” para que funcione com ActiveX XHRs.

O IE8 e acima também adicionaram resources de domínio cruzado aos objects XmlHttpRequest nativos, mas ainda não joguei com eles.

Se o servidor responder a um método OPTIONS e a GET e POST (o que estiver usando) com um header como:

 Access-Control-Allow-Origin: * 

Pode funcionar bem. Parece no FireFox 3.5 e no rekonq 0.4.0. Aparentemente, com esse header e a resposta inicial a OPTIONS, o servidor está dizendo ao navegador: “Vá em frente e deixe essa solicitação entre domínios passar”.

Considere também o tempo limite da solicitação :

O navegador moderno retorna readyState = 4 e s tatus = 0 se muito tempo passar antes da resposta do servidor.

Adicione setRequestHeader("Access-Control-Allow-Origin","*") à sua resposta do servidor.

Eu havia enfrentado um problema semelhante. Tudo estava bem, o “estado pronto” era 4, mas o “status” era 0. Era porque eu estava usando um servidor portátil Apache PHP e meu arquivo no qual eu usava o object “XMLHttpRequest” era um arquivo html. Eu mudei a extensão do arquivo para php e o problema foi resolvido.

Para responder à pergunta de por que o http://127.0.0.1/cd_catalog.xml funciona enquanto http://localhost/cd_catalog.xml não: o Firefox está tratando 127.0.0.1 e localhost como dois domínios diferentes.

Abra o console javascript . Você verá uma mensagem de erro lá. No meu caso, foi CORS.

Aqui está outro caso em que status === 0 , específico para o upload:

Se você append um manipulador de events 'load' ao XHR.upload , conforme sugerido pelo MDN (role para baixo até a parte de upload de ‘Monitoramento do progresso’), o object XHR terá status=0 e todas as outras propriedades serão sequências vazias. Se você append o manipulador 'load' diretamente ao object XHR, como faria ao baixar o conteúdo, você deve estar bem (já que não está executando o localhost).

No entanto, se você deseja obter bons dados em seus manipuladores de events 'progress' , é necessário append um manipulador ao XHR.upload , não diretamente ao próprio object XHR.

Eu só testei isso até agora no Chrome OSX, então não tenho certeza de quanto do problema aqui é a documentação do MDN e quanto é a implementação do Chrome …

Alex Robinson já (e primeiro) dá a resposta correta para esta questão. Mas para elaborar um pouco mais …

Você deve adicionar o header de resposta HTTP:

Access-Control-Allow-Origin: *

Se você fizer isso, o resultado não é apenas “pode ​​funcionar”, mas “funcionará”.

NB O que você precisa adicionar é um header de resposta HTTP – então você só pode fazer isso em um servidor que você controla. Nunca será possível buscar diretamente http://w3schools.com/XML/cd_catalog.xml a partir de sua URL original usando um XMLHttpRequest (conforme a pergunta do OP), porque esse recurso não (pelo menos, não a partir de 24 de abril de 2015) ) incluem qualquer header CORS.

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing dá mais informações.

Meu problema semelhante a este foi resolvido, verificando o meu código html. Eu estava tendo um manipulador onclick no meu botão de envio de formulário para um método. assim: onclick="sendFalconRequestWithHeaders()" . Este método, por sua vez, chama o ajax exatamente como o seu e faz o que eu quero. Mas não como esperado, meu navegador não estava retornando nada.

Aprendi com o trabalho duro de alguém , voltei falso neste manipulador e resolvi. Deixe-me mencionar que antes de chegar a este post, passei um final de semana inteiro de 3 dias e meio dia escrevendo códigos CORS filters , jetty config , outras jersey and embedded jetty coisas relacionadas a jersey and embedded jetty – apenas para consertar isso. minha compreensão em torno de cross domain ajax requests e coisas de padrões. Foi ridículo como erros simples em javascript fazem você burro.

Para ser verdade, tentei signed.applets.codebase_principal_support = true e escrito isLocalHost() **if** . pode ser este método precisa ser implementado por nós, o firefox diz que não existe tal Agora eu tenho que limpar o meu código para enviar o patch do git de forma limpa. Graças a isso alguém.

Uma solicitação de navegador “127.0.0.1/somefile.html” chega inalterada ao servidor da Web local, enquanto “localhost / somefile.html” pode chegar como “0: 0: 0: 0: 0: 0: 0: 1 / somefile.html “se o IPv6 é suportado. Então, o último pode ser processado como indo de um domínio para outro.

Alex Robinson e bmju forneceram informações valiosas para entender questões de origem cruzada. Eu queria acrescentar que você pode precisar fazer uma chamada OPTIONS explícita no seu código de cliente antes de fazer o GET / POST desejado (por exemplo, em um ponto de extremidade de serviço CORS OAuth). Seu navegador / biblioteca pode não manipular automaticamente a solicitação OPTIONS. Gruber, esta é uma das respostas possíveis para a sua pergunta.

Eu tive o mesmo problema (o readyState era 4 e o status 0) , então segui uma abordagem diferente explicada neste tutorial: https://spring.io/guides/gs/consuming-rest-jquery/

Ele não usou XMLHttpRequest , em vez disso, ele usou o método jquery $ .ajax () :

      

The ID is

The content is

e para o arquivo public / hello.js (ou você poderia inseri-lo no mesmo código HTML diretamente):

 $(document).ready(function() { $.ajax({ url: "http://rest-service.guides.spring.io/greeting" }).then(function(data) { $('.greeting-id').append(data.id); $('.greeting-content').append(data.content); }); }); 

Edit: Por favor, leia os comentários de Malvolio abaixo como o conhecimento desta resposta está desatualizado.

Você não pode fazer XMLHttpRequests entre domínios.

A chamada para 127.0.0.1 funciona porque sua página de teste está localizada em 127.0.0.1 , e o teste local também funciona desde que, bem … é um teste local.

Os outros dois testes falham porque o JavaScript não pode se comunicar com um servidor distante por meio de XMLHttpRequest.

Você pode, em vez disso, considerar:

  • XMLHttp – solicite seu próprio servidor para buscar seu conteúdo XML remoto para você (script php, por exemplo)
  • Tentando usar um serviço como o GoogleAppEngine, se você quiser manter o JavaScript completo.

espero que ajude