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 em http://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
e 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.html
só 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
Origin
cabeç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 GET
sem cabeçalhos sofisticados. Se a solicitação não for simples (como um POST
com application/json
como tipo de conteúdo), o navegador a aguardará por um momento e, antes de atendê-la, enviará primeiro uma OPTIONS
solicitação ao URL de destino. Como acima, ele só continuará se a resposta a essa OPTIONS
solicitação contiver os cabeçalhos CORS. Essa OPTIONS
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 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.com
ela fará apenas chamadas regulares para www.example.com
! Outros URLs, como api.example.com
ou mesmo example.com
ou www.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.