jQuery 在请求正文中发布有效的 json

Posted

技术标签:

【中文标题】jQuery 在请求正文中发布有效的 json【英文标题】:jQuery posting valid json in request body 【发布时间】: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'
);

【问题讨论】:

【参考方案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",,如该线程中所述:***.com/questions/21201270/…

以上是关于jQuery 在请求正文中发布有效的 json的主要内容,如果未能解决你的问题,请参考以下文章

AJAX 请求正文为空(无 jQuery)

具有自定义标头和请求正文作为 JSON 字符串的跨域 jquery ajax 请求

如何通过 HttpClient 在 POST 请求中将 JSON 数据作为正文发送

如何在改造请求的正文中发布原始的整个 JSON?

jQuery getJSON 请求在有效请求上返回空

ASP.NET Core 在 json 发布请求正文中传递 antiforgerytoken