Empty responseText de XMLHttpRequest

Eu escrevi um XMLHttpRequest que corre bem, mas retorna um responseText vazio.

O javascript é o seguinte:

var anUrl = "http://api.xxx.com/rates/csv/rates.txt"; var myRequest = new XMLHttpRequest(); callAjax(anUrl); function callAjax(url) { myRequest.open("GET", url, true); myRequest.onreadystatechange = responseAjax; myRequest.setRequestHeader("Cache-Control", "no-cache"); myRequest.send(null); } function responseAjax() { if(myRequest.readyState == 4) { if(myRequest.status == 200) { result = myRequest.responseText; alert(result); alert("we made it"); } else { alert( " An error has occurred: " + myRequest.statusText); } } } 

O código é executado corretamente. Eu posso percorrer e obter o readyState == 4 e um status == 200, mas o responseText está sempre em branco.

Eu estou recebendo um erro de log (no Safari debugging) de despachar erro: getProperties que não consigo encontrar referência para.

Eu executei o código no Safari e no Firefox tanto localmente quanto em um servidor remoto.

A URL quando colocada em um navegador retornará a string e fornecerá um código de status de 200.

Eu escrevi código semelhante para a mesma URL em um Mac Widget que roda bem, mas o mesmo código em um navegador nunca retorna um resultado.

http://api.xxx.com/ parte do seu domínio? Caso contrário, você está sendo bloqueado pela mesma política de origem .

Talvez você queira verificar a seguinte postagem do Stack Overflow para algumas soluções possíveis:

  • Formas de contornar a política de mesma origem

PROBLEMA RESOLVIDO

No meu caso, o problema é que eu faço a chamada ajax (com os methods $ .ajax, $ .get ou $ .getJSON do jQuery) com caminho completo no parâmetro url:

URL: ” http://mydomain.com/site/cgi-bin/serverApp.php

Mas a maneira correta é passar o valor de url como:

url: “site / cgi-bin / serverApp.php”

Alguns navegadores não entram em conflito e não distinguem entre um texto ou outro, mas no Firefox 3.6 para Mac OS siga este caminho completo como ” cross site scripting ” … outra coisa, no mesmo navegador, há uma distinção entre:

http://mydomain.com/site/index.html

E colocar

http://www.mydomain.com/site/index.html

Na verdade, é o ponto de vista correto, mas a maioria das implementações não faz distinção, então a solução foi remover todo o texto que especifica o caminho completo para o script nos methods que fazem o pedido ajax E …. remover qualquer tag BASE no arquivo index.html

base href = “http://mydomain.com/” <--- má ideia, remova-a!

Se você não removê-lo, esta versão do navegador para este sistema pode receber sua solicitação do ajax, como se fosse uma solicitação de cross site!

Eu tenho o mesmo problema, mas apenas na máquina Mac OS. O problema é que o Firefox trata a resposta do ajax como uma chamada “cross site”, em qualquer outra máquina / navegador funciona bem. Eu não encontrei nenhuma ajuda sobre isso (acho que é um problema de implementação do firefox), mas vou provar o próximo código no lado do servidor:

 header('Content-type: application/json'); 

para garantir que o navegador obtenha os dados como “json data” …

O navegador está impedindo você de criar scripts entre sites.

Se a URL estiver fora do seu domínio, você precisará fazer isso no servidor ou movê-lo para o seu domínio.

Isso pode não ser a melhor maneira de fazer isso. Mas de alguma forma funcionou para mim, então eu vou correr com isso.

Na minha function php que retorna os dados, uma linha antes da linha de retorno, eu adiciono uma instrução echo, ecoando os dados que eu quero enviar.

Agora, claro porque funcionou, mas aconteceu.

Teve um problema semelhante ao seu. O que tivemos que fazer é usar a solução document.domain encontrada aqui:

Formas de contornar a política de mesma origem

Também precisávamos mudar isso no lado do serviço da web. Usou o header “Access-Control-Allow-Origin” encontrado aqui:

https://developer.mozilla.org/En/HTTP_access_control