Saya mencoba membuat permintaan posting Cross Origin, dan saya membuatnya berfungsi dengan jelas JavaScript
seperti ini:
var request = new XMLHttpRequest();
var params = "action=something";
request.open('POST', url, true);
request.onreadystatechange = function() {if (request.readyState==4) alert("It worked!");};
request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
request.setRequestHeader("Content-length", params.length);
request.setRequestHeader("Connection", "close");
request.send(params);
Tapi saya ingin menggunakan jQuery
, tapi saya tidak bisa membuatnya bekerja. Inilah yang saya coba:
$.ajax(url, {
type:"POST",
dataType:"json",
data:{action:"something"},
success:function(data, textStatus, jqXHR) {alert("success");},
error: function(jqXHR, textStatus, errorThrown) {alert("failure");}
});
Ini menghasilkan Kegagalan. Jika ada yang tahu mengapa jQuery
tidak berhasil, beri tahu kami semua. Terima kasih.
(Saya menggunakan jQuery
1.5.1, dan Firefox 4.0, dan server saya merespons dengan Access-Control-Allow-Origin
header yang tepat )
javascript
jquery
xmlhttprequest
cors
Magmatis
sumber
sumber
Jawaban:
UPDATE: Seperti yang TimK tunjukkan, ini tidak diperlukan lagi dengan jquery 1.5.2. Tetapi jika Anda ingin menambahkan tajuk khusus atau mengizinkan penggunaan kredensial (nama pengguna, kata sandi, atau cookie, dll.), Baca terus.
Saya rasa saya menemukan jawabannya! (4 jam dan banyak kutukan nanti)
//This does not work!! Access-Control-Allow-Headers: *
Anda perlu menentukan secara manual semua tajuk yang akan Anda terima (setidaknya itu yang saya alami di FF 4.0 & Chrome 10.0.648.204).
Metode $ .ajax jQuery mengirimkan header "x-diminta-dengan" untuk semua permintaan lintas domain (menurut saya ini hanya lintas domain).
Jadi header yang hilang yang diperlukan untuk menanggapi permintaan OPTIONS adalah:
//no longer needed as of jquery 1.5.2 Access-Control-Allow-Headers: x-requested-with
Jika Anda meneruskan tajuk non "sederhana", Anda harus memasukkannya ke dalam daftar (saya mengirim satu lagi):
//only need part of this for my custom header Access-Control-Allow-Headers: x-requested-with, x-requested-by
Jadi untuk menggabungkan semuanya, inilah PHP saya:
// * wont work in FF w/ Allow-Credentials //if you dont need Allow-Credentials, * seems to work header('Access-Control-Allow-Origin: http://www.example.com'); //if you need cookies or login etc header('Access-Control-Allow-Credentials: true'); if ($this->getRequestMethod() == 'OPTIONS') { header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); header('Access-Control-Max-Age: 604800'); //if you need special headers header('Access-Control-Allow-Headers: x-requested-with'); exit(0); }
sumber
Kemungkinan lain adalah pengaturan tersebut
dataType: json
menyebabkan JQuery mengirimkanContent-Type: application/json
header. Ini dianggap sebagai header non-standar oleh CORS, dan memerlukan permintaan preflight CORS. Jadi beberapa hal untuk dicoba:1) Coba konfigurasikan server Anda untuk mengirim tanggapan sebelum penerbangan yang benar. Ini akan menjadi header tambahan seperti
Access-Control-Allow-Methods
danAccess-Control-Allow-Headers
.2) Jatuhkan
dataType: json
pengaturan. JQuery harus memintaContent-Type: application/x-www-form-urlencoded
secara default, tetapi untuk memastikan, Anda dapat menggantidataType: json
dengancontentType: 'application/x-www-form-urlencoded'
sumber
application/x-www-form-urlencoded
dan genaptext/plain
. Dan saya mencoba menambahkan tajuk tanggapanAccess-Control-Allow-Methods "POST, GET, OPTIONS"
Tidak ada yang berhasil.dataType
memengaruhiAccept
header permintaan, tetapi tidak memengaruhi headerContent-Type
permintaan.Anda mengirim "params" di js:
request.send(params);
tetapi "data" di jquery ". Apakah data ditentukan ?:
data:data,
Selain itu, Anda memiliki kesalahan di URL:
$.ajax( {url:url, type:"POST", dataType:"json", data:data, success:function(data, textStatus, jqXHR) {alert("success");}, error: function(jqXHR, textStatus, errorThrown) {alert("failure");} });
Anda mencampur sintaks dengan yang untuk $ .post
Pembaruan : Saya mencari-cari di Google berdasarkan jawaban monsur, dan saya menemukan bahwa Anda perlu menambahkan
Access-Control-Allow-Headers: Content-Type
(di bawah ini adalah paragraf lengkap)http://metajack.im/2010/01/19/crossdomain-ajax-for-xmpp-http-binding-made-easy/
sumber
var data = {action:"something"}
jQuery.ajaxSetup({'beforeSend': function(xhr) {xhr.setRequestHeader(string, string)}})
dan bermain dengan tajuk berbeda yang dikirim (contoh untuk rel di sini: railscasts.com/episodes/136-jquery )Cors mengubah metode permintaan sebelum selesai, dari POST ke OPTIONS, jadi, data posting Anda tidak akan dikirim. Cara yang berhasil untuk menangani masalah cors ini, melakukan permintaan dengan ajax, yang tidak mendukung metode OPTIONS. kode contoh:
$.ajax({ type: "POST", crossdomain: true, url: "http://localhost:1415/anything", dataType: "json", data: JSON.stringify({ anydata1: "any1", anydata2: "any2", }), success: function (result) { console.log(result) }, error: function (xhr, status, err) { console.error(xhr, status, err); } });
dengan header ini di c # server:
if (request.HttpMethod == "OPTIONS") { response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With"); response.AddHeader("Access-Control-Allow-Methods", "GET, POST"); response.AddHeader("Access-Control-Max-Age", "1728000"); } response.AppendHeader("Access-Control-Allow-Origin", "*");
sumber
Ubah Jquery Anda dengan cara berikut:
$.ajax({ url: someurl, contentType: 'application/json', data: JSONObject, headers: { 'Access-Control-Allow-Origin': '*' }, //add this line dataType: 'json', type: 'POST', success: function (Data) {....} });
sumber
contentType: 'application/json', data: JSONObject,
- Server tidak mengharapkan JSON, jadi mengirim JSON tidak masuk akal. Juga tidak ada yang namanya Objek JSON .headers: { 'Access-Control-Allow-Origin': '*' }, //add this line
- Jangan lakukan itu.Access-Control-Allow-Origin
adalah header respons , bukan header permintaan. Paling banter ini tidak akan menghasilkan apa-apa. Paling buruk itu akan mengubah permintaan dari permintaan sederhana menjadi permintaan preflighted yang membuatnya lebih sulit untuk ditangani di server.