49

Zepto または Jquery で $.ajax を使用してオブジェクトの配列を POST したいと考えています。どちらも同じ奇妙なエラーを示しますが、何が間違っているのかわかりません。

「RestEasy」などのテスト クライアントを使用して送信すると、データがサーバーに保存されます。ブラウザのネット パネルでリクエストが壊れているのがわかるので、JS が原因だと思います。

オブジェクトの配列を POST のデータ プロパティとして送信すると、正しく送信されません。

データ オブジェクト:

var postData = [
    { "id":"1", "name":"bob"}
  , { "id":"2", "name":"jonas"}
  ]

リクエスト:

$.ajax({
  url: _saveDeviceUrl
, type: 'POST'
, contentType: 'application/json'
, dataType: 'json'
, data: postData
, success: _madeSave.bind(this)
//, processData: false //Doesn't help
});

ブラウザに表示されるリクエスト本文:

"bob=undefined&jonas=undefined"

これは、jQuery と Zepto の両方が POST データを準備するために使用する $.param メソッドを使用することで、より直接的に確認できます。

$.param(
  [
    { "id":"1", "name":"bob"}
  , { "id":"2", "name":"jonas"}
  ]
)
// Output: "bob=undefined&jonas=undefined"

したがって、これらのライブラリが複雑な投稿データに対して行う準備は、私の予想とは異なるようです。

この回答が表示されますが、多くのコンテンツを投稿しているため、データをクエリパラメーターとして送信したくありません。 jQueryを使用して.ajax投稿で配列を送信するにはどうすればよいですか?

jQuery/Zepto を使用して POST 経由で複数のオブジェクトを送信する正しい方法は何ですか?

$.ajax({... data: JSON.stringify(postData) ...}) を使用すると、破損していないコンテンツが送信されますが、サーバーはその形式を好みません。

更新: JSON.stringify は正しくフォーマットされたコンテンツを送信するようです。問題は、サーバー側が必要なオブジェクトの構造について非常に具体的であることです。オブジェクトにプロパティを追加または削除すると、一致するプロパティを使用するのではなく、プロセス全体が失敗します。サーバーから送信されたコンテンツをビュー モデルとして使用するのは便利ですが、ビュー モデルが変更されるため、これは不便です。...まだ最善の解決策に取り組んでいます。

4

5 に答える 5

89

stringify送信する前に必ず確認してください。ライブラリに頼りすぎて、投稿している contentType に基づいて適切にエンコードされると思っていましたが、そうではないようです。

作品:

$.ajax({
    url: _saveAllDevicesUrl
,   type: 'POST'
,   contentType: 'application/json'
,   data: JSON.stringify(postData) //stringify is important
,   success: _madeSave.bind(this)
});

私は $.toJSON のようなプラグインを使用するよりもこの方法を好みますが、それでも同じことを達成できます。

于 2012-06-25T15:09:17.910 に答える
17

次のことを試してください。

$.ajax({
  url: _saveDeviceUrl
, type: 'POST'
, contentType: 'application/json'
, dataType: 'json'
, data: {'myArray': postData}
, success: _madeSave.bind(this)
//, processData: false //Doesn't help
});
于 2012-06-19T21:54:00.173 に答える
5

編集:ほとんどのブラウザーでサポートされているネイティブのJSON.stringify()メソッドを使用しても安全になり始めていると思います(はい、気になる場合は IE8+ でも)。

単純な:

JSON.stringify(yourData)

データを送信する前に JSON でエンコードする必要があります。このようなオブジェクトを POST データとして送信することはできません。

そのためには、 jQuery json プラグインを使用することをお勧めします。次に、jQuery で次のようなものを使用できます。

$.post(_saveDeviceUrl, {
    data : $.toJSON(postData)
}, function(response){
    //Process your response here
}
);
于 2012-06-19T21:46:21.690 に答える