7

RESTful バックエンドを備えた webapp の場合、jquery の$postを使用して json をサーバーに投稿しています。驚いたことに、json はリクエスト本文ではなく、リクエストのフォーム データのパラメーター キーに詰め込まれています。他の方法を考えることはできますが、問題は、なぜ期待どおりに機能しないのかということです。

サーバーでは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 を使用すると、すべてが 1 つのパラメーター キーに詰め込まれます。これが正常な場合、その理由と、サーバー上でこれをきれいに解明する方法を知りたいです。正常でない場合、$post を使用して応答本文で取得するにはどうすればよいか知りたいです。

更新: $.post で contentType をサポートするための jquery の機能要求があります。

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は、通常のURLエンコード形式であるため、バックエンドがjsonを解析しようとしないようにする必要があります。

于 2012-01-06T12:25:33.997 に答える
4

$.post() メソッドが application/x-www-form-urlencoded に設定する原因となっている content-type を設定していません。

$.ajax() を使用し、content-type を明示的に application/json に設定します。

よろしく、ヴィンセント。

于 2012-01-06T12:28:13.760 に答える
0

Vincent Partingtonは正しいです、デフォルトのcontentTypeはapplication/x-www-form-urlencodedに設定されています

代わりにjQuery.ajax関数を直接使用するか、独自の省略形を作成してください。

サーバー側を変更することもできます 。たとえば、Spring3MVC-高度なデータバインディング-単純なオブジェクト のリストを含むフォームリクエストを参照してください。しかし、私は完全なajax関数を使用します。

于 2012-01-06T12:47:23.450 に答える