对于具有RESTful后端的webapp,我使用jquery的$post将一些json发布到服务器。令我惊讶的是,json被填充在请求的表单数据的参数键中,而不是在请求体中。我可以想到一些other ways to do it,但问题是为什么它不像我期望的那样有效。
在服务器上,我使用scalatra并打印一些请求信息:
println("Request received:")
println(fromInputStream(request.getInputStream).getLines().mkString)
println("--------------")
println(request.getParameterMap.toString)
println("==============")
现在是一个简单的卷曲,我认为是正确的:
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}
==============
因此,如果我使用带有字符串化的json字符串和回调的$ post,我会将所有内容填充到单个参数键中。如果这是正常的,我想知道为什么,以及我应该如何在服务器上彻底解开这个问题。如果不正常,我想知道我应该怎么做才能使用$ post将它放到响应主体中。
更新:现在有一个feature request for jquery to support contentType on $.post
答案 0 :(得分: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编码形式。
答案 1 :(得分:4)
您没有设置导致$ .post()方法将其设置为application / x-www-form-urlencoded的内容类型。
使用$ .ajax()并将content-type明确设置为application / json。
问候,文森特。
答案 2 :(得分: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函数。