Estou trabalhando neste projeto pessoal meu apenas por diversão, onde desejo ler um arquivo xml que está localizado em http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml e analisar o xml e use-o para converter valores entre as moedas.
Até agora, eu vim com o código abaixo que é bastante básico para ler o xml, mas recebo o seguinte erro.
XMLHttpRequest não pode carregar ****. Nenhum cabeçalho 'Access-Control-Allow-Origin' está presente no recurso solicitado. Origin ' http://run.jsbin.com ', portanto, não tem acesso permitido.
$(document).ready(
function() {
$.ajax({
type: 'GET',
url: 'http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml',
dataType: 'xml',
success: function(xml){
alert('aaa');
}
});
}
);
Não vejo nada de errado com meu código, então espero que alguém possa apontar o que estou fazendo de errado com meu código e como posso corrigi-lo.
javascript
jquery
ajax
xml-parsing
cors
Bazinga777
fonte
fonte
Respostas:
Você não poderá fazer uma chamada ajax para a
http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
partir de um arquivo implantado emhttp://run.jsbin.com
devido à política de mesma origem .Como a página de origem (também conhecida como origem ) e o URL de destino estão em domínios (
run.jsbin.com
ewww.ecb.europa.eu
) diferentes, seu código está, na verdade, tentando fazer uma solicitação de vários domínios (CORS) , não uma solicitação comumGET
.Em poucas palavras, a política de mesma origem diz que os navegadores devem permitir apenas chamadas ajax para serviços no mesmo domínio da página HTML.
Exemplo:
Uma página em
http://www.example.com/myPage.html
só pode solicitar diretamente serviços emhttp://www.example.com
, comohttp://www.example.com/api/myService
. Se o serviço estiver hospedado em outro domínio (digamoshttp://www.ok.com/api/myService
), o navegador não fará a chamada diretamente (como seria de esperar). Em vez disso, ele tentará fazer uma solicitação CORS.Resumindo, para realizar uma solicitação (CORS) * em diferentes domínios, seu navegador:
Origin
cabeçalho na solicitação original (com o domínio da página como valor) e o executará normalmente; e depoisAccess-Control-Allow-Origin
é um deles ) permitindo a solicitação CORS, o navegador completará a chamada (quase ** exatamente da maneira que faria se a página HTML estivesse no mesmo domínio).* A descrição acima descreve as etapas em uma solicitação simples , como uma regular
GET
sem cabeçalhos sofisticados. Se a solicitação não for simples (como umPOST
comapplication/json
como tipo de conteúdo), o navegador a aguardará por um momento e, antes de atendê-la, enviará primeiro umaOPTIONS
solicitação ao URL de destino. Como acima, ele só continuará se a resposta a essaOPTIONS
solicitação contiver os cabeçalhos CORS. EssaOPTIONS
chamada é conhecida como solicitação de comprovação .** Estou dizendo quase porque existem outras diferenças entre chamadas regulares e chamadas CORS. Um aspecto importante é que alguns cabeçalhos, mesmo se presentes na resposta, não serão selecionados pelo navegador se não estiverem incluídos no
Access-Control-Expose-Headers
cabeçalho.Como corrigi-lo?
Foi apenas um erro de digitação? Às vezes, o código JavaScript apresenta apenas um erro de digitação no domínio de destino. Você verificou? Se a página estiver aberta,
www.example.com
ela fará apenas chamadas regulares parawww.example.com
! Outros URLs, comoapi.example.com
ou mesmoexample.com
ouwww.example.com:8080
são considerados domínios diferentes pelo navegador! Sim, se a porta for diferente, é um domínio diferente!Adicione os cabeçalhos. A maneira mais simples de habilitar o CORS é adicionar os cabeçalhos necessários (as
Access-Control-Allow-Origin
) às respostas do servidor. (Cada servidor / idioma tem uma maneira de fazer isso - verifique algumas soluções aqui .)Último recurso: se você não tiver acesso do lado do servidor ao serviço, também pode espelhá-lo (por meio de ferramentas como proxies reversos ) e incluir todos os cabeçalhos necessários.
fonte
Access-Control-Allow-Origin
nesse URL os cabeçalhos não importam - o navegador abrirá a URL normalmente. A política de mesma origem (e o requisito para oAccess-Control-Allow-Origin
cabeçalho) se aplica apenas a chamadas Ajax.Existe uma forma hack-tastic de fazer isso se você tiver o php habilitado em seu servidor. Mude esta linha:
para esta linha:
e então no script php (se você tiver permissão para usar a função file_get_contents ()):
Php não parece se importar se esse url é de uma origem diferente. Como eu disse, essa é uma resposta maluca e tenho certeza de que há algo errado com ela, mas funciona para mim.
Editar: Se você deseja armazenar o resultado em cache, aqui está o arquivo php que você usaria:
O código de cache é obtido a partir daqui .
fonte
file_get_contents
chamada apenas se o arquivo XML mais recente estiver suficientemente datado. Além disso, não se esqueça do cabeçalho Content-Type :-)