0

我最近在使用 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() 并让它工作?

4

2 回答 2

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"});

于 2012-08-09T14:44:40.107 回答
0

我认为答案是 $.post() 自动将数据编码为 application/x-www-form-urlencoded。通过切换到 $.ajax() 调用,您可以选择编码,我的经验清楚地暗示了这一点。感谢大家!

于 2012-08-15T23:19:33.457 回答