Ви не зможете здійснити виклик 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) до відповідей сервера. (Кожен сервер / мова має спосіб зробити це - перевірте деякі рішення тут .)
Крайній засіб: якщо у вас немає доступу до служби на стороні сервера, ви також можете його віддзеркалити (за допомогою таких інструментів, як зворотні проксі-сервери ) і включити туди всі необхідні заголовки.