jQuery在请求体中发布有效的json

bra*_*rad 162 ajax jquery json xmlhttprequest

因此,根据jQuery Ajax文档,它在发送请求时以查询字符串的形式序列化数据,但设置processData:false应该允许我在正文中发送实际的JSON.不幸的是,我很难确定第一个,如果发生这种情况,那么第二个对象看起来是什么,它被发送到服务器.我所知道的是服务器没有解析我发送的内容.

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

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

有没有人有过在请求体中序列化JSON数据的Java服务的经验,请求是从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'
});
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 266

实际的JSON请求如下所示:

data: '{"command":"on"}',
Run Code Online (Sandbox Code Playgroud)

您发送实际JSON字符串的位置.对于更一般的解决方案,使用JSON.stringify()将对象序列到JSON,这样的:

data: JSON.stringify({ "command": "on" }),
Run Code Online (Sandbox Code Playgroud)

为了支持不具备老版本浏览器JSON对象,使用json2.js这将添加它.


目前发生的事情是,因为你有processData: false,它基本上发送这个:({"command":"on"}).toString()这是[object Object]你在你的请求中看到的.

  • @brad - 正确,执行此操作后无关紧要,因为它已经是*一个字符串,在这种情况下[jQuery不会进一步处理它](https://github.com/jquery/jquery/blob/1.4 0.3/SRC/ajax.js#L207). (5认同)
  • 旁注:如果有人需要它作为“正文请求有效负载”而不是表单数据,请不要忘记包含“contentType:“application/json; charset = utf-8”,”,如本线程中所述:https:/ /stackoverflow.com/questions/21201270/how-to-submit-json-data-by-request-body-in-jquery (5认同)
  • 像魅力一样工作,非常感谢!那么所有的请求主体都应该是在另一端被解析的字符串是否正确? (2认同)