Why does jquery post json as a parameter name instead of as the request body?
对于具有RESTful后端的webapp,我使用jquery的$ post将一些json发布到服务器。令我惊讶的是,json被填充在请求的表单数据的参数键中,而不是在请求体中。我可以想到其他一些方法,但问题是为什么它不能像我期望的那样工作。
在服务器上我使用scalatra并打印一些请求信息:
1 2 3 4 5 | println("Request received:") println(fromInputStream(request.getInputStream).getLines().mkString) println("--------------") println(request.getParameterMap.toString) println("==============") |
现在一个简单的卷曲,我认为是正确的:
1 | curl -X POST http://localhost:8080/x -H"Content-Type: application/json" -d '{"a":"b"}' |
生产:
1 2 3 4 5 | Request received: {"a":"b"} ------------- {} ============== |
并用html + js来说明问题:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <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 type="text/javascript"> function doPost() { $.post("http://localhost:8080/x", JSON.stringify({"a":"b"} ), function(data) {}); } </body> </html> |
生产:
1 2 3 4 5 | Request received: -------------- {{"a":"b"}=[Ljava.lang.String;@7a2897ac} ============== |
因此,如果我使用带有字符串化的json字符串和回调的$ post,我会将所有内容填充到单个参数键中。如果这是正常的,我想知道为什么,以及我应该如何在服务器上彻底解开这个问题。如果不正常,我想知道我应该怎么做才能使用$ post在响应体中获取它。
更新:现在有一个jquery的功能请求,以支持$ .post上的contentType
如果你下降到$ .ajax,我认为你可以这样做
1 2 3 4 5 6 7 8 9 | $.ajax( { url:"http://localhost:8080/x", data: JSON.stringify({a: 'b'}), processData: false, type: 'POST', contentType: 'application/json' } ); |
您没有设置导致$ .post()方法将其设置为application / x-www-form-urlencoded的内容类型。
使用$ .ajax()并将content-type设置为application / json。
问候,文森特。
Vincent Partington是对的,默认的contentType设置为application / x-www-form-urlencoded
直接使用jQuery.ajax函数或创建自己的速记。
您也可以更改服务器端,请参阅
Spring 3 MVC - 高级数据绑定 - 带有简单对象列表的表单请求
例如。 但我会使用完整的ajax函数。