Ви не зможете здійснити виклик ajax http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
із файлу, розгорнутого в, http://run.jsbin.com
через політику того самого походження .
В якості джерела (він же походження ) сторінки і цільової 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
без вигадливих заголовків. Якщо запит не є простим (наприклад, a POST
з application/json
типом вмісту), браузер затримає його хвилинку і, перш ніж виконати його, спочатку надішле 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
) до відповідей сервера. (Кожен сервер / мова має спосіб зробити це - перевірте деякі рішення тут .)
Крайній засіб: якщо у вас немає доступу до служби на стороні сервера, ви також можете його віддзеркалити (за допомогою таких інструментів, як зворотні проксі-сервери ) і включити туди всі необхідні заголовки.