jQuery memposting json yang valid di badan permintaan

180

Jadi menurut dokumen jQuery Ajax , ini membuat serialisasi data dalam bentuk string kueri saat mengirim permintaan, tetapi pengaturan processData:falseharus memungkinkan saya untuk mengirim JSON yang sebenarnya di badan. Sayangnya saya mengalami kesulitan menentukan terlebih dahulu, jika ini terjadi dan apa objek terlihat seperti yang sedang dikirim ke server. Yang saya tahu adalah bahwa server tidak menguraikan apa yang saya kirim.

Saat menggunakan klien http untuk memposting objek literal {someKey:'someData'}, itu berfungsi. Tetapi ketika menggunakan jQuery dengan data: {someKey:'someData'}, gagal. Sayangnya ketika saya menganalisis permintaan di Safari, dikatakan pesan payload adalah [object Object]... bagus ... dan di Firefox posnya kosong ...

Ketika masuk konten tubuh di sisi Jawa itu benar-benar [object Object]jadi bagaimana seseorang mengirim data JSON NYATA ??

Adakah yang punya pengalaman dengan layanan Java yang mem-serialisasi data JSON di badan permintaan, dengan permintaan yang dikirim dari jQuery?

BTW di sini adalah permintaan $ .ajax penuh:

$.ajax({
    contentType: 'application/json',
    data: {
        "command": "on"
    },
    dataType: 'json',
    success: function(data){
        app.log("device control succeeded");
    },
    error: function(){
        app.log("Device control failed");
    },
    processData: false,
    type: 'POST',
    url: '/devices/{device_id}/control'
});
brad
sumber

Jawaban:

292

Permintaan JSON yang sebenarnya akan terlihat seperti ini:

data: '{"command":"on"}',

Di mana Anda mengirim string JSON yang sebenarnya. Untuk solusi yang lebih umum, gunakan JSON.stringify()untuk membuat serialisasi objek ke JSON, seperti ini:

data: JSON.stringify({ "command": "on" }),

Untuk mendukung browser lama yang tidak memiliki JSONobjek, gunakan json2.js yang akan menambahkannya.


Apa yang terjadi saat ini adalah karena Anda memilikinya processData: false, pada dasarnya mengirimkan ini: ({"command":"on"}).toString()yang [object Object]... apa yang Anda lihat dalam permintaan Anda.

Nick Craver
sumber
jadi apakah saya tidak lagi memerlukan processData: false using JSON.stringify()?
brad
6
@brad - benar, tidak masalah setelah melakukan ini karena itu sudah menjadi string, dan dalam hal ini jQuery tidak akan memprosesnya lebih lanjut .
Nick Craver
2
bekerja seperti pesona, terima kasih banyak! Apakah benar kalau semua badan permintaan diharapkan menjadi string yang diurai di ujung yang lain?
brad
Mengapa jQuery mem-parsing datastring, bukan hanya mengirimnya sebagai JSON?
Adam Zerner
Catatan: jika ada yang membutuhkannya sebagai "muatan permintaan tubuh" alih-alih data formulir, jangan lupa sertakan contentType: "application/json; charset=utf-8",seperti yang disebutkan di utas ini: stackoverflow.com/questions/21201270/…
raydlevel5