【问题标题】:jQuery posting valid json in request bodyjQuery 在请求正文中发布有效的 json
【发布时间】:2011-05-08 18:21:23
【问题描述】:

所以根据jQuery Ajax docs,它在发送请求时以查询字符串的形式序列化数据,但是设置processData:false应该允许我在正文中发送实际的JSON。不幸的是,我很难首先确定是否发生这种情况,然后第二次确定正在发送到服务器的对象是什么样子。我只知道服务器没有解析我发送的内容。

当使用http client 发布对象文字{someKey:'someData'} 时,它可以工作。但是当使用带有data: {someKey:'someData'} 的jQuery 时,它会失败。不幸的是,当我在 Safari 中分析请求时,它说消息有效负载是 [object Object] ... 太好了...而在 Firefox 中,帖子是空白的...

在 Java 端记录正文内容时,它实际上会得到 [object Object],那么如何发送 REAL JSON 数据??

有没有人使用 Java 服务序列化请求正文中的 JSON 数据,并从 jQuery 发送请求?

顺便说一句,这里是完整的 $.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'
});

【问题讨论】:

    标签: jquery ajax json xmlhttprequest


    【解决方案1】:

    实际的 JSON 请求如下所示:

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

    您发送实际 JSON 字符串的位置。对于更通用的解决方案,使用JSON.stringify() 将对象序列化为 JSON,如下所示:

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

    要支持没有JSON 对象的旧版浏览器,请使用json2.js 将其添加进去。


    目前发生的情况是,既然您有 processData: false,它基本上会发送这个:({"command":"on"}).toString(),即 [object Object]...您在请求中看到的内容。

    【讨论】:

    • 所以我不再需要 processData: false using JSON.stringify() 了吗?
    • @brad - 正确,这样做后没关系,因为它已经是一个字符串,在这种情况下是jQuery won't process it further
    • 工作就像一个魅力,非常感谢!那么所有请求主体都应该是在另一端解析的字符串,这是真的吗?
    • 为什么 jQuery 将 data 解析为字符串,而不是仅将其作为 JSON 发送?
    • 旁注:如果有人需要它作为“正文请求有效负载”而不是表单数据,请不要忘记包含contentType: "application/json; charset=utf-8",,如该线程中所述:stackoverflow.com/questions/21201270/…
    猜你喜欢
    • 2016-09-26
    • 2021-03-19
    • 2017-02-12
    • 2011-07-02
    • 2019-06-18
    • 2023-04-10
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多