Anda tidak akan dapat melakukan panggilan ajax ke http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xmldari file yang diterapkan di http://run.jsbin.comkarena kebijakan asal yang sama .
Karena halaman sumber (alias asal ) dan URL target berada di domain yang berbeda ( run.jsbin.comdan www.ecb.europa.eu), kode Anda sebenarnya mencoba membuat permintaan Cross-domain (CORS) , bukan hal biasa GET.
Singkatnya, kebijakan yang sama-asal mengatakan bahwa browser hanya mengizinkan panggilan ajax ke layanan di domain yang sama pada halaman HTML.
Contoh:
Halaman di http://www.example.com/myPage.htmlhanya dapat secara langsung meminta layanan yang ada di http://www.example.com, seperti http://www.example.com/api/myService. Jika layanan dihosting di domain lain (misalnya http://www.ok.com/api/myService), browser tidak akan melakukan panggilan secara langsung (seperti yang Anda harapkan). Sebaliknya, ia akan mencoba membuat permintaan CORS.
Singkatnya, untuk melakukan permintaan (CORS) * di berbagai domain, browser Anda:
- Akan menyertakan
Originheader dalam permintaan asli (dengan domain halaman sebagai nilai) dan melakukannya seperti biasa; lalu
- Hanya jika server respon permintaan yang berisi header yang memadai (
Access-Control-Allow-Originadalah salah satu dari mereka ) yang memungkinkan CORS meminta, browse akan menyelesaikan panggilan (hampir ** persis dengan cara yang akan jika halaman HTML berada di domain yang sama).
- Jika header yang diharapkan tidak muncul, browser akan menyerah begitu saja (seperti yang terjadi pada Anda).
* Di atas menggambarkan langkah-langkah dalam permintaan sederhana , seperti permintaan biasa GETtanpa header mewah. Jika permintaan tidak sederhana (seperti POSTdengan application/jsonsebagai tipe konten), browser akan menahannya sebentar, dan, sebelum memenuhinya, terlebih dahulu akan mengirim OPTIONSpermintaan ke URL target. Seperti di atas, ini hanya akan berlanjut jika tanggapan atas OPTIONSpermintaan ini berisi header CORS. Ini OPTIONSpanggilan dikenal sebagai preflight permintaan.
** Saya katakan hampir karena ada perbedaan lain antara panggilan biasa dan panggilan CORS. Yang penting adalah bahwa beberapa header, meskipun ada dalam respons, tidak akan diambil oleh browser jika tidak disertakan dalamAccess-Control-Expose-Headers header.
Bagaimana memperbaikinya?
Apakah itu hanya salah ketik? Terkadang kode JavaScript hanya memiliki kesalahan ketik di domain target. Sudahkah kamu periksa? Jika halaman di www.example.comitu hanya akan membuat panggilan biasa ke www.example.com! URL lain, seperti api.example.comatau bahkan example.comatau www.example.com:8080dianggap domain berbeda oleh browser! Ya, jika porta berbeda, maka itu adalah domain yang berbeda!
Tambahkan header. Cara termudah untuk mengaktifkan CORS adalah dengan menambahkan header (sebagai Access-Control-Allow-Origin) yang diperlukan ke respons server. (Setiap server / bahasa memiliki cara untuk melakukan itu - periksa beberapa solusi di sini .)
Pilihan terakhir: Jika Anda tidak memiliki akses sisi server ke layanan, Anda juga dapat mencerminkannya (melalui alat seperti proxy terbalik ), dan menyertakan semua tajuk yang diperlukan di sana.