You won't be able to make an ajax call to
http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml from a file deployed at
http://run.jsbin.com due to the same-origin policy.
As the source (aka origin) page and the target URL are at different domains (
www.ecb.europa.eu), your code is actually attempting to make a Cross-domain (CORS) request, not an ordinary
In a few words, the same-origin policy says that browsers should only allow ajax calls to services at the same domain of the HTML page.
A page at
http://www.example.com/myPage.html can only directly request services that are at
http://www.example.com/api/myService. If the service is hosted at another domain (say
http://www.ok.com/api/myService), the browser won't make the call directly (as you'd expect). Instead, it will try to make a CORS request.
To put it shortly, to perform a (CORS) request* across different domains, your browser:
- Will include an
Origin header in the original request (with the page's domain as value) and perform it as usual; and then
- Only if the server response to that request contains the adequate headers (
Access-Control-Allow-Origin is one of them) allowing the CORS request, the browse will complete the call (almost** exactly the way it would if the HTML page was at the same domain).
- If the expected headers don't come, the browser simply gives up (like it did to you).
* The above depicts the steps in a simple request, such as a regular
GET with no fancy headers. If the request is not simple (like a
application/json as content type), the browser will hold it a moment, and, before fulfilling it, will first send an
OPTIONS request to the target URL. Like above, it only will continue if the response to this
OPTIONS request contains the CORS headers. This
OPTIONS call is known as preflight request.
** I'm saying almost because there are other differences between regular calls and CORS calls. An important one is that some headers, even if present in the response, will not be picked up by the browser if they aren't included in the
How to fix it?
www.example.com it will only make regular calls to
www.example.com! Other URLs, such as
api.example.com or even
www.example.com:8080 are considered different domains by the browser! Yes, if the port is different, then it is a different domain!
Add the headers. The simplest way to enable CORS is by adding the necessary headers (as
Access-Control-Allow-Origin) to the server's responses. (Each server/language has a way to do that - check some solutions here.)
Last resort: If you don't have server-side access to the service, you can also mirror it (through tools such as reverse proxies), and include all the necessary headers there.