4

私はASP.NET Web APIを勉強していますが、リクエストボディから来る複雑な型についての説明のどこかで、作者は私を混乱させます:

プロフェッショナル ASP.NET MVC 4 : 第 11 章 - ASP.NET Web API

「[..] 複合型 (その他すべて) は本体から取得されます。追加の制限もあります。本体から取得できる値は 1 つだけであり、その値は本体全体を表す必要があります。[... ]"

ブラッド・ウィルソン

この「単一の価値は身体からもたらされる」という彼の意味は何ですか? API フォーマッターは、本体から単一のタイプのオブジェクトのみを解析できますか? これを例で説明していただけますか?

4

2 に答える 2

4

本体から取得できる値は 1 つだけです

このようなリクエストボディがあるとします。

{"Id":12345, "FirstName":"John", "LastName":"West"}

この JSON を、このような型のパラメーターにバインドする必要があります。

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

アクションメソッドは次のようになりvoid Post(Employee emp)ます。そして、こんなはずじゃない―― void Post(Employee john, Employee duplicateJohn)。本体から取得できる値は 1 つだけです。

その値はボディ全体を表す必要があります

このような同じリクエストボディがあるとします。

{"Id":12345, "FirstName":"John", "LastName":"West"}

そして、このような 2 つの DTO があります。

public class Identifier
{
    public int Id { get; set; }
}

public class Name
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

のようなアクション メソッドを持つことはできずvoid Post(Identifier id, Name name)、本体が両方のパラメーターに部分的にバインドされることを期待できません。本体全体は、 1 つの値のみにバインドする必要があります。だから、次のようなクラスを持つ

public class Employee
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

リクエスト本文全体を 1 つの値にバインドすることvoid Post(Employee emp)のみが許可されます。

于 2013-08-08T17:55:15.257 に答える
1

これは基本的に、複数の複合型を記述するマルチパート ボディを使用できないことを意味します。型がある場合、+型ではなくUser、本体全体でそのUser型を記述しなければなりません。UserShoppingChart

タイプの有効な本文User:

{
   "id" : "1",
   "username" : "someuser"
}

タイプのボディが無効ですUser:

{
   "user" : {
      "id" : "1",
      "username" : "someuser"
   },

   "shoppingCart" : {
      "cartId" : "1",
      "items" : "5"
   }
}

もちろん、UserAndShoppingCart(ユーザー クラスとショッピング カート クラスをプロパティとして使用する) のような新しい複合型を作成すると、無効なボディが有効になり、この新しい型に対して逆シリアル化できるようになります。

于 2013-08-08T15:48:09.937 に答える