我最近使用JQuery和Spring Roo遇到了一个问题。我想将数据发布到Spring Roo控制器的JSON启用URL(我认为这不是特别重要,但为了清楚起见,我把它放在那里)。我知道控制器工作正常,因为我可以通过Curl命令向它发布数据,如下所示:
curl -i -X POST -H "Content-Type:application/json" http://localhost:8080/PeopleProject/people
-d '{"firstName":"some","lastName":"guy","email":"some@guy.com"}
那么,我尝试用Javascript中的$ .post()调用发布数据,如下所示:
var data = {"firstName":"some","lastName":"guy","email":"some.guy@gmail.com"};
$.post('/PeopleProject/people', data, successfulPost ) ;
但是,我会在服务器端遇到关于无法解析输入的错误。运行调试器,我可以看到通过此Javascript发布的数据是通过URL编码发送的,而来自curl命令的数据则不是。
最后,经过多次搞乱,我尝试了这个Javascript:
var jqxhr =
$.ajax({
url: "/PeopleProject/people",
processData : true,
contentType:"application/json",
type : "POST",
data: '{"firstName":"some","lastName":"guy","email":"some.guy@gmail.com"}',
})
这很有效!但是,我不确定它为什么有效,$ .post()没有。关于Javascript / JQuery的人比我更了解这个吗?
我以为我在某个地方看到一个JSON帖子到服务器会把东西编码为名称值对,但我猜这不对,因为我已经看到curl命令发布了漂亮,干净的JSON,而$ .post()推送了一个URL编码的查询字符串。
所以我的问题是:上面的ajax()是否是将JSON数据推送到服务器的首选方法?或者,有没有办法使用$ .push()并让它工作?
答案 0 :(得分:1)
$.post
不支持processData
作为参数。 http://api.jquery.com/jQuery.post/
jQuery.post( url [, data] [, success(data, textStatus, jqXHR)] [, dataType] )
<强>更新强>
processData: false
告诉jquery将数据参数保留为原样(在本例中为json字符串)并将其作为请求体发送。由于$.post
没有选项可以禁用processData
,因此如果没有先使用$.post
$.ajaxSetup({processData: false, contentType: "application/json"});
进行操作
答案 1 :(得分:0)
我认为答案是$ .post()会自动将数据编码为application / x-www-form-urlencoded。通过切换到$ .ajax()调用,您可以选择编码,这是我的经验所明确暗示的。谢谢大家!