Вы не сможете выполнить ajax-вызов http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
из файла, развернутого в, http://run.jsbin.com
из -за политики того же происхождения .
Поскольку исходная страница (также известная как origin ) и целевой URL-адрес находятся в разных доменах ( run.jsbin.com
и www.ecb.europa.eu
), ваш код на самом деле пытается сделать междоменный (CORS) запрос, а не обычный GET
.
Короче говоря, политика одного и того же происхождения гласит, что браузеры должны разрешать вызовы ajax только к службам в том же домене HTML-страницы.
Пример:
Страница по адресу http://www.example.com/myPage.html
может напрямую запрашивать только те услуги, которые находятся по адресу http://www.example.com
, например http://www.example.com/api/myService
. Если служба размещена в другом домене (скажем http://www.ok.com/api/myService
), браузер не будет выполнять вызов напрямую (как и следовало ожидать). Вместо этого он попытается сделать запрос CORS.
Короче говоря, для выполнения запроса (CORS) * в разных доменах ваш браузер:
- Включит
Origin
заголовок в исходный запрос (с доменом страницы в качестве значения) и выполнит его как обычно; а потом
- Только если сервер ответ на этот запрос содержит адекватные заголовки (
Access-Control-Allow-Origin
это один из них ) позволяя CORS запрос, просматривает завершит вызов (почти ** именно так , как это было бы , если страница HTML была в том же домене).
- Если ожидаемые заголовки не приходят, браузер просто отказывается (как и вы).
* Выше показаны шаги в простом запросе, например в обычном запросе GET
без дополнительных заголовков. Если запрос не является простым (например, POST
с application/json
типом содержимого as), браузер задержит его на мгновение и, прежде чем выполнить его, сначала отправит OPTIONS
запрос на целевой URL. Как и выше, он будет продолжаться только в том случае, если ответ на этот OPTIONS
запрос содержит заголовки CORS. Этот OPTIONS
вызов называется предполетным запросом.
** Я говорю почти потому, что есть другие различия между обычными вызовами и вызовами CORS. Важным является то, что некоторые заголовки, даже если они присутствуют в ответе, не будут приняты браузером, если они не включены вAccess-Control-Expose-Headers
заголовок.
Как это исправить?
Это просто опечатка? Иногда в коде JavaScript есть просто опечатка в целевом домене. Вы проверили? Если страница находится на www.example.com
ней, будут совершаться только регулярные звонки по адресу www.example.com
! Другие URL-адреса, такие как api.example.com
или даже example.com
или www.example.com:8080
считаются браузером другими доменами! Да, если порт другой, то это другой домен!
Добавьте заголовки. Самый простой способ включить CORS - это добавить необходимые заголовки (as Access-Control-Allow-Origin
) к ответам сервера. (У каждого сервера / языка есть способ сделать это - проверьте некоторые решения здесь .)
В крайнем случае : если у вас нет доступа к сервису на стороне сервера, вы также можете отразить его (с помощью таких инструментов, как обратные прокси ) и включить туда все необходимые заголовки.