1

httpリクエストを介してJavaScriptオブジェクトを送信するのに問題があります。http endpoingは、json content-type( "application/json"または"text/ json")のみを受け入れます。

data2(文字列化されたjson)が正常に機能する理由はわかりませんが、data1(jsonオブジェクト)はhttp 400BadRequestをスローします。つまり、jQueryがjsonオブジェクトをサーバーが処理するための有効なjson文字列にシリアル化しないのはなぜですか。

var data1 = ({ rating : 3 });  //does not work
var data2 = '{ "rating" : 3}'; //works fine

$.ajax({
    url : "/rate",
    data : data1,
    type : "POST",
    contentType: "application/json",
    success: function(json){
        console.log("Ajax Return :"+json);
    }
});
4

5 に答える 5

6

json文字列を送信する場合は、processDataをfalseに設定する必要があります。設定しない場合、jQueryはデータに渡されたものを処理し、それをparam文字列に変換します。

$.ajax({
    url: "/rate",
    data: data2,
    processData: false,
    contentType: "application/json",
    success: function(json) {
        console.log("Ajax Return :" + json);
    }
});​

最近ここでこれに答えたと思います:jQueryを使用してPOST-bodyをJSONオブジェクトに設定する

于 2012-06-01T21:34:12.850 に答える
2

デフォルトでは、ajax jQuery呼び出しの一部であるデータパラメータ値は、JSオブジェクトをurl-form-encoding、つまり「param1 = value&param2=value」文字列に変換します。これは、GETリクエストとPOSTリクエストの両方に当てはまります。

興味深いことに、ajaxメソッド呼び出しで{contentType: "application / json"}を明示的に指定しても、適切なヘッダーのみが設定され、データパラメーターの値として渡すJSオブジェクトはJSON文字列に変換されません(常に1つより多くのインテリジェンスを期待しています)が、それでもurl-form-encodingとしてエンコードされます。したがって、JSオブジェクトをJSON文字列に明示的に変換する必要があります。

そうするためのオプションがあります、

  1. JSON.stringify(obj); Javascriptの一部であり、ECMA5標準に由来すると思います。最も簡単ですが、欠点は、IE6以前の古いブラウザでは機能しないことです。
  2. jQueryjsonプラグイン。いくつかの追加機能もあります。
  3. json.orgからのコード

したがって、json本体を必要とするPOSTリクエストは次のように機能します。

var dataStr = JSON.stringify({ rating : 3 });  

$.ajax({
    url : "/rate",
    data : dataStr,
    type : "POST",
    contentType: "application/json",
    success: function(json){
        console.log("Ajax Return :"+json);
    }
});

注:「processData」ブールパラメータの影響ここでの回答の中には、{processData:false}を設定する必要があるとの回答があります。しかし、そうではありません。これは、「データ」パラメータのタイプが文字列でない場合にのみ効果があります。文字列でない場合、デフォルトの動作はオブジェクトをurl-form-encodingに変換することです。しかし、これはほとんど役に立たないと思います。通常のObjectを渡し、processDataがfalseに設定されている場合、(data).toStringを実行しようとすると、「[Object][Object]」が生成されてかなり役に立たなくなります。

于 2012-06-01T22:36:29.147 に答える
1

dataTypeを「json」に設定すると機能するはずです。その後、JSON.stringifyを使用する必要はありません。

$.ajax({
    type: 'POST',
    url: '/rate',
    data: { rating : 3 },
    dataType: 'json',
    success: function (d) { ... }
}
于 2012-12-04T17:07:42.957 に答える
0

data1はオブジェクト、data2は文字列です。それらはそのままサーバーに送信されます。

于 2012-06-01T21:34:47.827 に答える
0

これは古い投稿だと思いますが、これが私のために働いた解決策です。dataTypeを「json」として設定し、contentTypeを完全に削除すると、うまくいくはずです。完全なコードは次のとおりです。

var data1 = { rating : 3 };

    $.ajax({
        url : "/rate",
        data : data1,
        dataType: 'json',
        type : "POST",
        //contentType: "application/json",
        success: function(json){
            console.log("Ajax Return :"+json);
        }
    });
于 2015-08-07T08:38:56.750 に答える