jQuery โพสต์ json ที่ถูกต้องในเนื้อหาคำขอ


180

ดังนั้นตามเอกสาร jQuery Ajaxมันทำให้ข้อมูลในรูปแบบของสตริงแบบสอบถามเมื่อส่งคำขอ แต่การตั้งค่าprocessData:falseควรอนุญาตให้ฉันส่ง JSON จริงในร่างกาย น่าเสียดายที่ฉันมีเวลาที่ยากลำบากในการพิจารณาก่อนหากสิ่งนี้เกิดขึ้นและครั้งที่ 2 สิ่งที่วัตถุดูเหมือนว่าจะถูกส่งไปยังเซิร์ฟเวอร์ ทั้งหมดที่ฉันรู้คือเซิร์ฟเวอร์ไม่ได้แยกวิเคราะห์สิ่งที่ฉันส่ง

เมื่อใช้ไคลเอนต์ httpเพื่อโพสต์วัตถุตามตัวอักษร{someKey:'someData'}มันทำงาน แต่เมื่อใช้ jQuery ด้วยdata: {someKey:'someData'}จะล้มเหลว น่าเสียดายที่เมื่อฉันวิเคราะห์คำขอใน Safari มันบอกว่าเพย์โหลดข้อความเป็น[object Object]... ยอดเยี่ยม ... และใน Firefox โพสต์นั้นว่างเปล่า ...

เมื่อทำการบันทึกเนื้อหาของร่างกายทางฝั่ง Java มันจะได้รับอย่างแท้จริง[object Object]ดังนั้นวิธีหนึ่งส่งข้อมูล REAL JSON?

มีใครเคยมีประสบการณ์กับบริการ Java ข้อมูลอนุกรม JSON ในเนื้อหาคำขอกับคำขอส่งจาก jQuery?

BTW นี่คือคำขอ $ .ajax แบบเต็ม:

$.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'
});

คำตอบ:


293

คำขอ JSON จริงจะมีลักษณะเช่นนี้:

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

ที่ที่คุณส่งสตริง JSON จริง สำหรับวิธีแก้ปัญหาทั่วไปที่มากขึ้นใช้JSON.stringify()ในการทำให้เป็นอันดับวัตถุกับ JSON เช่นนี้

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

เพื่อรองรับเบราว์เซอร์รุ่นเก่าที่ไม่มีJSONวัตถุให้ใช้json2.jsซึ่งจะเพิ่มลงใน


สิ่งที่เกิดขึ้นในปัจจุบันคือเมื่อคุณมีprocessData: falseมันส่งสิ่งนี้โดยทั่วไป: ({"command":"on"}).toString()ซึ่งก็คือ[object Object]... สิ่งที่คุณเห็นในคำขอของคุณ


จึงไม่ฉันไม่จำเป็นต้อง processData: เท็จใช้JSON.stringify()?
แบรด

6
@brad - ที่ถูกต้องก็จะไม่ได้เป็นเรื่องหลังจากที่ทำเช่นนี้เพราะมันเป็นอยู่แล้วสตริงและในกรณีที่jQuery จะไม่ดำเนินการได้ต่อไป
Nick Craver

2
ทำงานเหมือนมีเสน่ห์ขอบคุณมาก! เป็นความจริงหรือไม่ว่าหน่วยคำขอทั้งหมดคาดว่าจะเป็นสตริงที่แยกวิเคราะห์ที่ปลายอีกด้านหรือไม่
แบรด

เหตุใด jQuery จึงแยกdataสตริงเป็นสตริงซึ่งต่างจากการส่งเป็น JSON
Adam Zerner

หมายเหตุด้านข้าง: ถ้าใครต้องการมันเป็น "body request payload" แทนที่จะเป็นข้อมูลในฟอร์มอย่าลืมใส่contentType: "application/json; charset=utf-8",ไว้ในหัวข้อนี้: stackoverflow.com/questions/21201270/…
raydlevel5
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.