Anda tidak akan dapat melakukan panggilan ajax ke http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml
dari file yang diterapkan di http://run.jsbin.com
karena kebijakan asal yang sama .
Karena halaman sumber (alias asal ) dan URL target berada di domain yang berbeda ( run.jsbin.com
dan 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.html
hanya 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
Origin
header 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-Origin
adalah 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 GET
tanpa header mewah. Jika permintaan tidak sederhana (seperti POST
dengan application/json
sebagai tipe konten), browser akan menahannya sebentar, dan, sebelum memenuhinya, terlebih dahulu akan mengirim OPTIONS
permintaan ke URL target. Seperti di atas, ini hanya akan berlanjut jika tanggapan atas OPTIONS
permintaan ini berisi header CORS. Ini OPTIONS
panggilan 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.com
itu hanya akan membuat panggilan biasa ke www.example.com
! URL lain, seperti api.example.com
atau bahkan example.com
atau www.example.com:8080
dianggap 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.