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 usingJSON.stringify()
了吗?
@brad - 正确,这样做后没关系,因为它已经是一个字符串,在这种情况下是jQuery won't process it further。
工作就像一个魅力,非常感谢!那么所有请求主体都应该是在另一端解析的字符串,这是真的吗?
为什么 jQuery 将 data
解析为字符串,而不是仅将其作为 JSON 发送?
旁注:如果有人需要它作为“正文请求有效负载”而不是表单数据,请不要忘记包含contentType: "application/json; charset=utf-8",
,如该线程中所述:***.com/questions/21201270/…以上是关于jQuery 在请求正文中发布有效的 json的主要内容,如果未能解决你的问题,请参考以下文章
具有自定义标头和请求正文作为 JSON 字符串的跨域 jquery ajax 请求