7

对于具有 RESTful 后端的 webapp,我使用 jquery 的$post将一些 json 发布到服务器。现在令我惊讶的是,json 被填充在请求表单数据的参数键中,而不是在请求正文中。我可以想到其他一些方法来做到这一点,但问题是为什么它不能按我的预期工作。

在服务器上,我使用 scalatra 并打印一些请求信息:

println("Request received:")
println(fromInputStream(request.getInputStream).getLines().mkString)
println("--------------")
println(request.getParameterMap.toString)
println("==============")

现在一个简单的 curl 做我认为正确的事情:

curl -X POST http://localhost:8080/x -H "Content-Type: application/json" -d '{"a":"b"}'

产生:

Request received:
{"a":"b"}
-------------
{}
==============

还有一点 html+js 来说明问题:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<body>
  <button type="button" onclick="doPost()">
    POST
  </button>
  <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
  <script type="text/javascript">
function doPost() {
    $.post("http://localhost:8080/x",     
           JSON.stringify({"a":"b"} ), 
           function(data) {});
}
  </script>
</body>
</html>

产生:

Request received:

--------------
{{"a":"b"}=[Ljava.lang.String;@7a2897ac}
============== 

因此,如果我将 $post 与字符串化的 json 字符串和回调一起使用,我会将所有内容都填充在单个参数键中。如果这是正常的,我想知道为什么,以及我应该如何在服务器上干净地解开这个问题。如果它不正常,我想知道我应该怎么做才能使用 $post 在响应正文中获取它。

更新:现在有一个功能请求 jquery 支持 $.post 上的 contentType

4

3 回答 3

10

我认为如果您下拉到$.ajax ,您可以做到这一点

$.ajax(
  {
     url: "http://localhost:8080/x",
     data: JSON.stringify({a: 'b'}),
     processData: false,
     type: 'POST',
     contentType: 'application/json'
  }
);

processData告诉 jquery 不要弄乱您的数据,并且设置contentType应确保您的后端不会尝试解析 json,因为它是常规的 url 编码形式。

于 2012-01-06T12:25:33.997 回答
4

您没有设置导致 $.post() 方法将其设置为 application/x-www-form-urlencoded 的内容类型。

使用 $.ajax() 并将内容类型明确设置为 application/json。

问候,文森特。

于 2012-01-06T12:28:13.760 回答
0

Vincent Partington 是对的,默认 contentType 设置为 application/x-www-form-urlencoded

直接使用 jQuery.ajax 函数或创建自己的简写。

您还可以更改服务器端,例如参见 Spring 3 MVC - Advanced Data Binding - Form Request with List of Simple Objects 。但我只会使用完整的 ajax 函数。

于 2012-01-06T12:47:23.450 回答