2010-11-11 32 views
123

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

当使用http client发布对象文字{someKey:'someData'}时,它可以工作。但是,当使用带有data: {someKey:'someData'}的jQuery时,它失败。不幸的是,当我在Safari中分析请求时,它表示邮件有效负载为[object Object] ......很棒......并且在Firefox中该帖子是空白的......

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

有没有人有过使用jQuery发送的请求在请求正文中序列化JSON数据的Java服务的经验?

BTW这里是满$就要求:

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

回答

206

实际的JSON请求是这样的:

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

当你发送一个实际的JSON字符串。为了更广泛的解决方案,用JSON.stringify()将对象序列化到JSON,像这样:

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

为了支持不具备JSON对象旧的浏览器,使用json2.js将它添加


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

+0

所以我不再需要processData:false使用'JSON.stringify()'? – brad 2010-11-11 22:19:38

+4

@brad - 正确,这样做后无所谓,因为它已经*了一个字符串,在这种情况下[jQuery不会进一步处理它](https://github.com/jquery/jquery/blob/ 1.4.3/SRC/ajax.js#L207)。 – 2010-11-11 22:23:30

+1

像一个魅力工作,非常感谢!那么是否所有的请求体都是需要被解析的字符串呢? – brad 2010-11-12 14:28:38