Você não poderá fazer uma chamada ajax para a http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xmlpartir de um arquivo implantado em http://run.jsbin.comdevido à 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.come www.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 comum GET.
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.htmlsó pode solicitar diretamente serviços em http://www.example.com, como http://www.example.com/api/myService. Se o serviço estiver hospedado em outro domínio (digamos http://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:
- Incluirá um
Origincabeçalho na solicitação original (com o domínio da página como valor) e o executará normalmente; e depois
- Somente se a resposta do servidor àquela solicitação contiver os cabeçalhos adequados (
Access-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).
- Se os cabeçalhos esperados não vierem, o navegador simplesmente desiste (como aconteceu com você).
* A descrição acima descreve as etapas em uma solicitação simples , como uma regular GETsem cabeçalhos sofisticados. Se a solicitação não for simples (como um POSTcom application/jsoncomo tipo de conteúdo), o navegador a aguardará por um momento e, antes de atendê-la, enviará primeiro uma OPTIONSsolicitação ao URL de destino. Como acima, ele só continuará se a resposta a essa OPTIONSsolicitação contiver os cabeçalhos CORS. Essa OPTIONSchamada é 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 noAccess-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.comela fará apenas chamadas regulares para www.example.com! Outros URLs, como api.example.comou mesmo example.comou www.example.com:8080sã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.