11

$.ajax次のようなデータ ディクショナリを POSTに使用しようとすると、次のようになります。

{
    list: ["fake_id_0"],
    mapType: "fakeToRealId"
}

jQuery は何かおかしなことをします。データを次のように変換します。

{
    list[]: ["fake_id_0"],
    mapType: "fakeToRealId"
}

ご覧のとおり、キーにブラケットを追加しますが、listキーには追加しませんmapType。一般的なRESTの意味では、はい、配列値を持つキーに括弧で名前を付けるのが一般的です...しかし、私のサーバーはそのようには機能しないため、POSTしようとするとlist[]問題が発生します。

$.ajaxこの問題は、次のコードで parseData オプションの処理まで追跡しました。

// Convert data if not already a string
if ( s.data && s.processData && typeof s.data !== "string" ) {
    s.data = jQuery.param( s.data, s.traditional );
}

使用するprocessData: falseと、そのブロックをスキップします...しかし、データをURLエンコードしません。

だから、私の質問は次のとおりです。jQuery でキー名を変更せずに$.ajax呼び出しを行うにはどうすればよいですか? processData: trueまたは、それに失敗した場合、どのように使用processData: falseします?

PSまたは、これがすべて非標準のjQueryの動作であり、私が持っているプラ​​グインが原因である場合は、代わりにお知らせください:-)

* 編集 *

私は自分の質問に答えましたが、その答えに欠陥があることに気付いたので、その答えを削除しました。traditional:true(呼び出しで)オプションを設定すると括弧が修正されると答えました$.ajaxが、そうです...しかし、ネストされたオブジェクトをシリアル化しないという副作用もあります。

したがって、私の修正された質問は次のとおりです。jQueryでキー名を変更せずに、ネストされたプロパティのシリアル化を無効にせずに$.ajax呼び出すにはどうすればよいですか? processData: true言い換えれば、キーにブラケットを追加しないことを除いて、jQuery に現在と同じようにすべてを実行させるにはどうすればよいでしょうか?

4

2 に答える 2

4

お気づきのように、これはバグではありません。ブラケットは、バージョン 1.4 以降、マルチレベル オブジェクトの問題を解決するために特別に配置されたと思います。.param() 自体を見て、理由を理解できます。http://api.jquery.com/jQuery.param/

あなたが望むことは不可能だと思います。確認する良い方法は、1つの文字列を手動でエンコードすることです。ブラケットなしでは、一意にデコード可能な方法でエンコードすることはできないと思います。

上記のリンクから引用して、私の答えを修正するには

注: 一部のフレームワークではシリアル化された配列を解析する機能が制限されているため、開発者は別の配列内にネストされたオブジェクトまたは配列を含む obj 引数を渡す際に注意する必要があります。

注: param 文字列について広く合意された仕様がないため、このような入力をサポートするすべての言語で理想的に機能する方法で、この方法を使用して複雑なデータ構造をエンコードすることはできません。代わりに、複雑なデータをエンコードするための代替手段として JSON 形式を使用してください。

したがって、サーバーが json を解析する準備ができている場合は、次のようにリクエストを送信できます。

$.ajax({
    url: 'something',
    type: 'GET',
    data: JSON.stringify(data),
    contentType: 'application/json; charset=utf-8',
});
于 2013-06-06T00:07:51.407 に答える
1

質問の本文ですでに暗示されていることは知っていますが、jQuery のこの素晴らしい機能を回避する方法は次のとおりです。あなたが持っている場合:

$.get(api_url, {my_param: my_arguments})

次のように変更します。

$.get(api_url, $.param({my_param: my_arguments}, true))
于 2016-05-23T13:10:57.380 に答える