2012-01-06 7 views
5

RESTfulなバックエンドを持つWebアプリケーションの場合、jqueryの$postを使用してjsonをサーバーに送信しています。今私の驚いたことに、jsonはリクエスト本体ではなくリクエストのフォームデータのパラメータキーに詰め込まれています。私はいくつかのことを考えることができますother ways to do it、しかし、質問は私が期待どおりに動作しない理由です。私はscalatraを使用して、いくつかの要求情報を印刷サーバー上なぜjqueryはリクエスト本体ではなくパラメータ名としてjsonを投稿しますか?

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を使用してレスポンス本体で取得するために何をすべきかを知りたいと思います。

UPDATE:私はあなたが$.ajax

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

processDataにドロップダウン場合は、この操作を行うことができると思いfeature request for jquery to support contentType on $.post

答えて

8

はあなたのデータの周り混乱にjqueryのではなく伝えるとcontentTypeを設定することを確認する必要がありますようになりましたあなたのバックエンドは、通常のURLエンコードされた形式であるため、jsonを解析しません。

4

$ .post()メソッドでapplication/x-www-form-urlencodedに設定されているコンテンツタイプを設定していません。

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

よろしくお願いいたします。

0

ヴィンセントパーティンが正しいと、デフォルトのcontentTypeのではなく、直接アプリケーション/ x-www-form-urlencodedで

使用jQuery.ajax関数に設定したり、独自の速記を作成しています。

また、サーバー側を変更することもできます。 Spring 3 MVC - Advanced Data Binding - Form Request with List of Simple Objects などを参照してください。しかし、私は完全なAjax関数を使用します。

関連する問題