Berikut adalah dua halaman, test.php dan testserver.php.
test.php
<script src="scripts/jq.js" type="text/javascript"></script>
<script>
$(function() {
$.ajax({url:"testserver.php",
success:function() {
alert("Success");
},
error:function() {
alert("Error");
},
dataType:"json",
type:"get"
}
)})
</script>
testserver.php
<?php
$arr = array("element1",
"element2",
array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>
Sekarang masalah saya: ketika kedua file ini berada di server yang sama (baik localhost atau server web), ia berfungsi dan alert("Success")
dipanggil; Jika ada di server yang berbeda, artinya testserver.php di server web dan test.php di localhost, itu tidak berfungsi, dan alert("Error")
sedang dijalankan. Bahkan jika URL di dalam ajax diubah menjadi http://domain.com/path/to/file/testserver.php
javascript
jquery
ajax
json
cross-domain
Firose Hussain
sumber
sumber
Jawaban:
Gunakan JSONP .
jQuery:
PHP:
Gema mungkin salah, sudah lama sejak saya menggunakan php. Dalam hal apa pun Anda perlu menampilkan
callbackName('jsonString')
pemberitahuan harga. jQuery akan memberikan nama panggilan baliknya sendiri, jadi Anda harus mendapatkannya dari parnet GET.Dan seperti yang diposting oleh Stefan Kendall, $ .getJSON () adalah metode singkat, tetapi kemudian Anda perlu menambahkan
'callback=?'
url sebagai parameter GET (ya, nilainya?, JQuery menggantikan ini dengan metode panggilan balik yang dihasilkan sendiri).sumber
callbackName('/* json */')
bukancallbackName(/* json */)
?JSONP adalah pilihan yang bagus, tetapi ada cara yang lebih mudah. Anda cukup mengatur
Access-Control-Allow-Origin
header di server Anda. Menyetelnya untuk*
akan menerima permintaan AJAX lintas-domain dari domain apa pun. ( https://developer.mozilla.org/en/http_access_control )Metode untuk melakukan ini akan bervariasi dari satu bahasa ke bahasa lainnya, tentu saja. Ini dia di Rails:
Dalam contoh ini,
say_hello
tindakan akan menerima permintaan AJAX dari domain apa pun dan mengembalikan respons "halo!".Berikut adalah contoh header yang mungkin kembali:
Semudah itu, memang ada beberapa batasan browser. Lihat http://caniuse.com/#feat=cors .
sumber
.post()
metode jQuery, Anda harus mengaktifkan dukungan lintas domain di jQuery. Hal ini dilakukan dengan ini:$.support.cors = true
.Anda dapat mengontrol ini melalui tajuk HTTP dengan menambahkan Access-Control-Allow-Origin . Menetapkannya ke * akan menerima permintaan AJAX lintas-domain dari domain apa pun.
Menggunakan PHP sangat sederhana, cukup tambahkan baris berikut ke dalam skrip yang ingin Anda akses di luar dari domain Anda:
Jangan lupa untuk mengaktifkan modul mod_headers di httpd.conf.
sumber
Anda perlu melihat Kebijakan Same Origin :
Agar Anda bisa mendapatkan data, itu harus:
Protokol dan host yang sama
Anda perlu menerapkan JSONP untuk mengatasinya.
sumber
Saya harus memuat halaman web dari disk "file: /// C: /test/htmlpage.html", panggil "http: //localhost/getxml.php" url, dan lakukan ini di browser IE8 + dan Firefox12 +, gunakan jQuery v1 .7.2 lib untuk meminimalkan kode boilerplate. Setelah membaca lusinan artikel akhirnya menemukan jawabannya. Ini ringkasan saya.
Berikut adalah contoh panggilan ajax jQuery dengan beberapa sysouts debug.
sumber
header("Access-Control-Allow-Origin: *");
Memang benar bahwa kebijakan yang sama-asal mencegah JavaScript dari membuat permintaan di seluruh domain, tetapi spesifikasi CORS memungkinkan hanya jenis akses API yang Anda cari, dan didukung oleh kumpulan browser utama saat ini.
Lihat cara mengaktifkan berbagi sumber daya lintas-asal untuk klien dan server:
http://enable-cors.org/
"Cross-Origin Resource Sharing (CORS) adalah spesifikasi yang memungkinkan akses benar-benar terbuka melintasi batas-batas domain. Jika Anda menyajikan konten publik, pertimbangkan untuk menggunakan CORS untuk membukanya untuk akses universal JavaScript / browser."
sumber
Ini mungkin, tetapi Anda harus menggunakan JSONP, bukan JSON. Tautan Stefan mengarahkan Anda ke arah yang benar. The halaman jQuery AJAX memiliki informasi lebih lanjut tentang JSONP.
Remy Sharp memiliki contoh terperinci menggunakan PHP .
sumber
Saya menggunakan server Apache, jadi saya menggunakan modul mod_proxy. Aktifkan modul:
Kemudian tambahkan:
Terakhir, sampaikan proxy-url ke skrip Anda.
sumber
Keamanan browser mencegah melakukan panggilan ajax dari halaman yang dihosting di satu domain ke halaman yang di-host di domain yang berbeda; ini disebut " kebijakan asal-sama ".
sumber
Ada beberapa contoh untuk menggunakan JSONP yang mencakup penanganan kesalahan.
Namun, harap dicatat bahwa acara kesalahan tidak dipicu saat menggunakan JSONP! Lihat: http://api.jquery.com/jQuery.ajax/ atau permintaan ajax jQuery menggunakan kesalahan jsonp
sumber
Dari dokumen Jquery ( tautan ):
Karena pembatasan keamanan browser, sebagian besar permintaan "Ajax" tunduk pada kebijakan asal yang sama; permintaan tidak dapat berhasil mengambil data dari domain, subdomain, atau protokol yang berbeda.
Permintaan skrip dan JSONP tidak tunduk pada batasan kebijakan asal yang sama.
Jadi saya anggap Anda perlu menggunakan jsonp untuk permintaan tersebut. Tetapi saya belum mencobanya sendiri.
sumber
Saya tahu 3 cara untuk menyelesaikan masalah Anda:
Pertama, jika Anda memiliki akses ke kedua domain, Anda dapat mengizinkan akses untuk semua domain lain menggunakan:
header("Access-Control-Allow-Origin: *");
atau hanya domain dengan menambahkan kode di bawah ke file .htaccess:
<FilesMatch "\.(ttf|otf|eot|woff)$"> <IfModule mod_headers.c> SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.net|dev02.otherdomain.net)$" AccessControlAllowOrigin=$0 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin </IfModule> </FilesMatch>
Anda dapat memiliki permintaan ajax ke file php di server Anda dan menangani permintaan ke domain lain menggunakan file php ini.
sumber
Untuk Microsoft Azure, ini sedikit berbeda.
Azure memiliki pengaturan CORS khusus yang perlu diatur. Ini pada dasarnya hal yang sama di balik layar, tetapi hanya mengatur header joshuarh menyebutkan tidak akan berfungsi. Dokumentasi Azure untuk mengaktifkan lintas domain dapat ditemukan di sini:
https://docs.microsoft.com/en-us/azure/app-service-api/app-service-api-cors-consume-javascript
Saya bermain-main dengan ini selama beberapa jam sebelum menyadari platform hosting saya memiliki pengaturan khusus ini.
sumber
itu bekerja, semua yang Anda butuhkan:
PHP:
JS (jQuery ajax):
sumber