Saya perhatikan ketika menggunakan $ .post () di jquery bahwa contentType default adalah application / x-www-form-urlencoded - ketika kode mvc asp.net saya perlu memiliki contentType = application / json
(Lihat pertanyaan ini mengapa saya harus menggunakan aplikasi / json: ASPNET MVC - Mengapa ModelState.IsValid false "Bidang x diperlukan" ketika bidang itu memang memiliki nilai? )
Bagaimana saya dapat menghasilkan $ .post () mengirim contentType = application / json? Saya sudah memiliki banyak fungsi $ .post (), jadi saya tidak ingin mengubah ke $ .ajax () karena itu akan memakan terlalu banyak waktu
Jika saya mencoba
$.post(url, data, function(), "json")
Itu masih memiliki contentType = application / x-www-form-urlencoded. Jadi apa sebenarnya yang dilakukan param "json" jika tidak mengubah contenttype menjadi json?
Jika saya mencoba
$.ajaxSetup({
contentType: "application/json; charset=utf-8"
});
Itu bekerja tetapi mempengaruhi setiap $. Get dan $ .post yang saya miliki dan menyebabkan beberapa rusak.
Jadi apakah ada cara agar saya dapat mengubah perilaku $ .post () untuk mengirim contentType = application / json?
sumber
jQuery.post
metode menimpa , ini adalah fungsi yang sangat sederhana ..."mystring data"
akanapplication/x-www-form-urlencoded;
di mana sebagai objek{ anyKey: "anyvalue and type" }
akanapplication/json
. Banyak server yang membaca json, hanya akan mengizinkan objek atau array, bukan string - jadi mengapa jquery memprediksi hal-hal seperti ini. Jika Anda memiliki server yang membaca string, angka, dll tanpa dibungkus objek, Anda harus menentukan tipe konten seperti dalam jawaban ini.Lihat: jQuery.ajax ()
sumber
JSON.stringify(data)
, karena server mengharapkan string JSON dan jQuery hanya akan menggabungkan pasangan nilai kunci menggunakan ampersand, bentuk-urlencoded.Akhirnya saya menemukan solusinya, yang bekerja untuk saya:
sumber
data
argumen Andax-www-form-urlencoded
, tetapi jika Anda menunjukkan bahwa tipe konten permintaan adalah JSON, itu tetap bersikeras mengirimdata
dalam format yang tidak cocok.Saya akhirnya menambahkan metode berikut ke jQuery di skrip saya:
Dan untuk menggunakannya
Ini dilakukan dengan hanya menyalin kode "get" dan "post" dari sumber JQuery asli dan meng-hardcoding beberapa parameter untuk memaksa JSON POST.
Terima kasih!
sumber
gunakan saja
UPDATED @JK: Jika Anda menulis dalam pertanyaan Anda hanya satu contoh kode dengan $ .post Anda menemukan satu contoh yang sesuai dalam jawabannya. Saya tidak ingin mengulangi informasi yang sama yang sudah Anda pelajari sampai Anda tahu: $ .post dan $. Get adalah bentuk singkat dari $ .ajax. Jadi gunakan saja $ .ajax dan Anda dapat menggunakan set lengkap parameternya tanpa harus mengubah pengaturan global apa pun.
Ngomong-ngomong, saya tidak akan merekomendasikan menimpa pos $ standar. Ini pendapat pribadi saya , tetapi bagi saya ini penting, tidak hanya programnya bekerja, tetapi juga semua orang yang membaca program Anda memahaminya dengan cara yang sama. Menimpa metode standar tanpa alasan yang sangat penting dapat menyebabkan kesalahpahaman dalam membaca kode program. Jadi saya ulangi rekomendasi saya sekali lagi: cukup gunakan $ .ajax form asli jQuery daripada
jQuery.get
danjQuery.post
dan Anda menerima program yang tidak hanya berfungsi dengan baik, tetapi dapat dibaca oleh orang-orang tanpa kesalahpahaman.sumber
Tipe data "json" yang dapat Anda lewati sebagai parameter terakhir yang dikirim () menunjukkan tipe data apa yang diharapkan fungsi dalam respons server, bukan tipe apa yang dikirim dalam permintaan. Khususnya itu mengatur header "Terima".
Jujur taruhan terbaik Anda adalah beralih ke panggilan ajax (). Fungsi post () dimaksudkan sebagai kenyamanan; versi sederhana dari panggilan ajax () ketika Anda hanya melakukan postingan formulir sederhana. Kamu tidak.
Jika Anda benar-benar tidak ingin beralih, Anda bisa membuat fungsi Anda sendiri bernama, katakanlah, xpost (), dan minta saja mengubah parameter yang diberikan menjadi parameter untuk panggilan jQuery ajax (), dengan set tipe-konten. Dengan begitu, alih-alih menulis ulang semua fungsi post () menjadi fungsi ajax (), Anda hanya perlu mengubah semuanya dari postingan menjadi xpost (atau apa pun).
sumber
Perpanjangan API jquery sederhana ini (dari: https://benjamin-schweizer.de/jquerypostjson.html ) untuk $ .postJSON () berhasil. Anda dapat menggunakan postJSON () seperti setiap panggilan Ajax jquery asli lainnya. Anda dapat melampirkan penangan acara dan sebagainya.
Seperti API Ajax lainnya (seperti $ http dari AngularJS) ia menetapkan contentType yang benar ke application / json. Anda dapat mengirimkan data json Anda (objek javascript) secara langsung, karena data tersebut akan diikat di sini. DataType yang dikembalikan diharapkan diatur ke JSON. Anda dapat melampirkan event handler jquery untuk janji, misalnya:
sumber
Saya tahu ini adalah jawaban yang terlambat, saya sebenarnya memiliki metode pintas yang saya gunakan untuk posting / membaca ke / dari layanan berbasis MS .. ia bekerja dengan MVC serta ASMX dll ...
Menggunakan:
CATATAN: Saya juga memiliki metode JSON.parseAjax yang dimodifikasi dari file JS json.org, yang menambahkan penanganan untuk tanggal MS "/ Tanggal (... )/" ...
File json2.js yang dimodifikasi tidak termasuk, ia menggunakan parser berbasis skrip dalam kasus IE8, karena ada contoh di mana parser asli rusak ketika Anda memperpanjang prototipe array dan / atau objek, dll.
Saya telah mempertimbangkan pembenahan kode ini untuk mengimplementasikan antarmuka yang dijanjikan, tetapi itu bekerja dengan sangat baik bagi saya.
sumber
Inti masalahnya adalah kenyataan bahwa JQuery pada saat penulisan tidak memiliki metode postJSON sementara getJSON ada dan melakukan hal yang benar.
metode postJSON akan melakukan hal berikut:
dan bisa digunakan seperti ini:
sumber
The dokumentasi saat ini menunjukkan bahwa pada 3,0, $ .post akan menerima pengaturan objek, yang berarti bahwa Anda dapat menggunakan $ ajax pilihan. 3.0 belum dirilis dan di komit mereka berbicara tentang menyembunyikan referensi untuk itu di dokumen, tetapi mencarinya di masa depan!
sumber
Saya memiliki masalah serupa dengan kode JavaScript berikut:
Di mana di Fiddler saya bisa melihat permintaan dengan:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
{"value":"5","maxValue":"5"}
Akibatnya, server saya tidak dapat memetakan objek ke jenis sisi server.
Setelah mengubah baris terakhir ke yang ini:
Di Fiddler saya masih bisa melihat:
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
value=5&maxValue=10
Namun, server mulai mengembalikan apa yang saya harapkan.
sumber
Bagaimana dengan adaptor / pembungkus Anda sendiri?
Dan penggunaan yang sangat sederhana:
sumber
Untuk beberapa alasan, mengatur jenis konten pada permintaan ajax seperti yang disarankan @Adrien tidak berfungsi dalam kasus saya. Namun, Anda sebenarnya dapat mengubah jenis konten menggunakan $ .post dengan melakukan ini sebelumnya:
Kemudian lakukan
$.post
panggilan:Saya mengalami masalah dengan jQuery + IIS, dan ini adalah satu-satunya solusi yang membantu jQuery memahami untuk menggunakan pengkodean windows-1252 untuk permintaan ajax.
sumber
kita dapat mengubah tipe-konten seperti ini di $ .post
$ .post (url, data, fungsi (data, status, xhr) {xhr.setRequestHeader ("Tipe konten", "application / x-www-form-urlencoded; charset = utf-8");});
sumber
$ .post tidak berfungsi jika Anda memiliki masalah CORS (Cross Origin Resource Sharing). Coba gunakan $ .Ajax dalam format berikut: "$ .ajax ({url: someurl, contentType: 'application / json', data: requestInJSONFormat, header: {'Access-Control-Allow-Origin': '*'}, dataType: 'json', ketik: 'POST', async: false, success: function (Data) {...}}); "
sumber
Anda tidak dapat mengirim
application/json
secara langsung - itu harus menjadi parameter permintaan GET / POST.Jadi sesuatu seperti itu
sumber