微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么jquery将json作为参数名而不是作为请求体发布?

对于具有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

解决方法

如果你下降到 $.ajax,我想你可以做到这一点
$.ajax(
  {
     url: "http://localhost:8080/x",data: JSON.stringify({a: 'b'}),processData: false,type: 'POST',contentType: 'application/json'
  }
);

processData告诉jquery不要乱用你的数据,设置contentType应该确保你的后端不会尝试解析json,因为它是一个常规的url编码形式.

原文地址:https://www.jb51.cc/jquery/176370.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐