5

だから私はこのコードを持っています:

var ajaxUrl = 'a/7776/as';
var data = {
    'answer' : {  'user_input'    : []  },
    'form_build_id' : 'form-ffe6f10e9601470ed4cfe38257a959a6'
}
 $.ajax({
    url: ajaxUrl,
    dataType: 'json',
    type: 'POST',
    data: data,
    success: function(json){
    }
  });

しかし、POST ソースを調べると、「回答」が送信されていないようです。

Firebug の POST ソースは次のとおりです。

Parametersapplication/x-www-form-urlencoded
form_build_id   form-ffe6f10e9601470ed4cfe38257a959a6
Source
form_build_id=form-ffe6f10e9601470ed4cfe38257a959a6

これはなぜですか? また、オブジェクトの「回答」部分も AJAX ポストに送信するにはどうすればよいですか?

4

4 に答える 4

3

デフォルトのPOSTエンコーディングはmultipart/form-dataで、フラットな一連のname=valueペアで構成されます。

name=value構造は複雑であるため、フラットな一連のペアに直接マッピングすることはできません。配列を参照するプロパティを持つオブジェクトであるメンバーがあります。

任意に複雑な構造を送信する場合は、別のエンコーディングを使用し、サーバーがそのエンコーディングを理解できるようにする必要があります。たとえば、JSON または XML をサーバーに送信できcontentTypeますが、メソッドのプロパティを設定することによって、それを行っていることを伝える必要があります (サーバーに送信するajaxデータの型を設定します)。次に、サーバーはその JSON または XML を逆シリアル化する方法を理解する必要があります。

または、構造が一連のフラットなname=valueペアにマッピングできることを確認してください。

中途半端な家はデータをとして送信multipart/form-dataすることですが、次のように単一のname=valueペアを送信し、そのvalue部分を異なるエンコーディングにする場合:

$.ajax({
    url: ajaxUrl,
    dataType: 'json',
    type: 'POST',
    data: {json: JSON.stringify(data)},
    success: function(json){
    }
});

という名前の単一のname=valueペアが送信jsonされます。値は JSON でエンコードされた文字列です。サーバー側はjson通常の方法でパラメーターの値を取得し、JSON デシリアライザーを使用してオブジェクト グラフを再作成します。

この中途半端な手法は、標準のリクエスト エンコーディング以外のものを使用することが困難なフレームワークで便利な場合があります。

于 2013-08-03T21:02:20.063 に答える
1

長さゼロの配列を投稿することはできないためです。POST (または HTTP クエリ) キーは型情報を持たず、長さ 0 の配列は POST 本文で効果的に null に組み込まれます: message = [] は '' にシリアル化されます。

于 2013-08-03T21:03:58.813 に答える
0

traditionalペイロードに配列を含める場合は、trueに設定する必要があります。

$.ajax({
    url: ajaxUrl,
    dataType: 'json',
    type: 'POST',
    data: data,
    traditional: true,
    success: function (json) {}
});
于 2013-08-03T20:57:43.533 に答える
0

TJ Crowderからの素晴らしい説明で、明確に知識があります。これが私の実用的な答えです。HTTP トラフィックを検査し、上記の AJAX リクエストを実行しました。予想通り、answer送信されていませんでした。また、上記のアドレナリンの回答に沿って、Googleで「ajaxが空の配列を送信していない」を検索すると、関連する結果の数だけで、これも問題であることがわかります。私がすることuser_inputは、空の配列の場合、null代わりに送信することです。確認するために自分で試してみましたが、やはり予想どおり、今回answerはリクエストでパラメーターが送信され、user_input以下のコードで null として送信されていることがわかりました。

var userInput = []; //not sure where this is coming from in reality, but this is just an example.

if (userInput.length == 0){  //in this example, this is obviously always true
    userInput = null;
}
var ajaxUrl = 'a/7776/as';

var data = {
    'answer' : {  'user_input'    : userInput  },
    'form_build_id' : 'form-ffe6f10e9601470ed4cfe38257a959a6'
}
$.ajax({
    url: ajaxUrl,
    dataType: 'json',
    type: 'POST',
    data: data,
    success: function(json){
    }
});
于 2013-08-03T21:32:32.883 に答える