1

Knockout.jsとASP.NETWebApiControllerを使用して新しいプロジェクトに取り組んでいます。私が見ている例の多くは、データをサーバーに投稿する前に、手動でJSONシリアル化を実行しています。さらに、リクエストのコンテンツタイプも同様に「application/json」に設定されることがよくあります。

なぜこれが必要なのか疑問に思います。私は、これを必要とするか、少なくとも望ましいものにする、まだ遭遇していない何かがあると思います。

現在、これらのjQueryajaxオプションを使用してサーバーに必要なデータを送信することに問題はありません。

        cache: false,
        traditional: true,
        type: 'POST',

これは、サンプルのJSオブジェクトと、ApiControllerアクションメソッドにPOSTしてバインドする対応するサーバー側のC#モデルオブジェクトです。

//JS object
var requestDataObject = {
    accountId: vm.accountId,
    range: [1, "a'b\"c", 3],
    start: new Date(2012, 12, 12)
};

//C# model object
public class RequestData
{
    public int AccountId { get; set; }
    public string[] Range { get; set; }
    public DateTime Start { get; set; }
}

//Action method signature
[HttpPost]
public HttpResponseMessage GetAccountUsage(RequestData requestData){
    ...

私は何が欠けていますか?

4

1 に答える 1

6

歴史的に、GET(およびその後のPOST)はキーと値のペアのみを送信でき、キーは一意である必要があります。

PHPが登場したとき、「キーに角かっこが含まれている場合は、配列を作成しましょう」と定義されていました。これにより、プログラマーはチェックボックスを呼び出しname="chkbox[]"、フォームを通常どおりに送信$_POST['chkbox']し、配列として読み取ることができました。他のいくつかのサーバー言語では、「クエリ文字列でキーが繰り返される場合は、配列を作成しましょう」と定義されています。

キーnames[]=1がサポートされることになっているのなら、なぜnames[a][b][c]=1ですか?サーバーは、何をすべきかを知っていましたnames = {a:{b:{c:"1"}}}

これにより、プログラマーはオブジェクトをエンコードして文字列をクエリできますが、いくつかの落とし穴があります。

  • すべての値は文字列です
  • 配列と数値キーを持つオブジェクトの区別はありません。PHPは気にしませんが、一部のサーバーは気にします。
  • 空のオブジェクトまたは配列をエンコードする方法はありません。従来の形式では、これにより空の配列が失われます。PHPは気にします。JQueryは、代わりに空の文字列を送信することでこれを解決します。
  • 値ごとにパスを繰り返す必要があるため、非常に非効率的ですcheckboxes[]=ch1&checkboxes[]=ch2&...checkboxes=["ch1","ch2",...]
  • PHPが気に入らないので、ターゲットプラットフォームを知っている必要があります(または、そうするサーバーtraditionalからの読み取りに頼る)postVars.get("names[]")
  • 一部のサーバーは、このエンコーディングをまったく理解していません。

JSONを使用すると、

  • null数字、文字列、、 ..をエンコードできます
  • ...配列、オブジェクト..。
  • 空の配列とオブジェクトは簡単に表現できます。空である可能性があるという理由だけで、各配列とオブジェクトの存在をテストする必要はありません。
  • キーが繰り返されることはないので、キーを短くする必要はありません
  • 自動キーで配列を表現する方法に混乱はありません。JSONは、送信先に関係なく同じ構造をエンコードします。
  • JSONの解析はどの言語でも可能です。多くの言語にはJSONサポートが組み込まれており、残りの言語はライブラリをフェッチできます
  • サーバーとクライアントに1行余分に書き込むだけです。

つまり、キーと値のペアをエンコードするだけでよい場合は、単純なGETまたはPOSTが優れています。配列をエンコードする必要がある場合は、JSONを検討する価値があります。より複雑なものが必要な場合は、JSONが一部のサーバーを使用する唯一の方法です。

于 2012-12-20T23:24:17.727 に答える