12

私はアプリケーションの WebAPI コントローラーを開発するように割り当てられました (これまで扱ったことのないものです)。すべてがうまくいき、テストの理由だけで GetAllUsers(int id) のようないくつかの基本的な要求がありました-構成自体は問題ありません。

では、本題です。GetAllItems(Carrier carrier)Carrier がさまざまなパラメーターを持つクラスであるメソッド があります。テスト目的でデータベースにいくつかの Carrier インスタンスが既にあるため、データベースにクエリを実行し、ID (GUID) 属性に基づいて Carrier のインスタンスを選択しましたが、結果はありませんでした。

入力パラメーターが単一の値 (int ID など) ではなく、手動でテスト メソッドまたは何らかのテスト入力パラメーターを使用してオブジェクトである場合に、GET 要求をテストする方法はありますか?

EDIT .:フィードバックをお寄せいただきありがとうございます。私の問題の解決策は、実際には予想よりもはるかに簡単に修正できました。残念ながら、私の評判は低すぎてそうすることができませんが(私はstackoverflowを初めて使用します)、近い将来にそうする必要があります。乾杯 :)

4

2 に答える 2

20

私があなたの質問を理解している限り、要求本文ではなく URL でキャリアのプロパティを直接渡すことができるようにしたいと考えています。

元:

[GET] http://localhost/entities?id=000000000000000

あなたのコントローラーメソッドはこれです

GetAllItems(Carrier carrier)

Carrier には Id (Guid) プロパティがあります。

class Carrier {
    public Guid Id { get; set; }
    public string Name { get; set; }
}

Carrier は、WebApi モデル バインディングに関して複雑なオブジェクトです。

モデル バインディングの既定の動作は次のとおりです。

既定では、Web API は次のルールを使用してパラメーターをバインドします。パラメーターが "単純な" 型の場合、Web API は URI から値を取得しようとします。単純型には、.NET プリミティブ型 (int、bool、double など)、TimeSpan、DateTime、Guid、decimal、string、および文字列から変換できる型コンバーターを持つ任意の型が含まれます。(型コンバーターについては後で詳しく説明します。) 複雑な型の場合、Web API は、メディア型フォーマッターを使用して、メッセージ本文から値を読み取ろうとします。

参照: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

URL で複雑なオブジェクトを使用したモデル バインディングを想定することは、WebApi の既定の動作ではありません。

コントローラー メソッドで URL から複雑なオブジェクトをモデル バインドする場合は、それを伝える必要があります。

GetAllItems([FromUri] Carrier carrier)

FromUri バインディング インジケーターを使用すると、URL から複雑なモデル バインディングを使用できます。

URL にさらに多くのプロパティ マッピングを追加できるようになりました。

[GET] http://localhost/entities?id=000000000000000&name=ABC

GetAllItems は、carrier.Id = 0000-00000000000-000; が入力された Carrier オブジェクトを受け取ります。Carrier.Name = "ABC"

于 2013-08-29T19:05:48.680 に答える
4

ここにはルーティングの問題があり、いくつかの誤解があります。

WebApi のデフォルト ルートは次のとおりです。

routes.MapHttpRoute(
            name: "Default",
            routeTemplate: "{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );

これと特定の規約:

  • GetX は GET メソッドをマップします。
  • InsertX は POST メソッドをマップします。
  • UpdateX は PUT メソッドをマップします。
  • DeleteX は DELETE メソッドをマップします。

命名規則が WepApi 規則と一致していない場合は、メソッド、アクション名などを指定する必要があります。

ルートでも同じことが起こります。他のルートが定義されていない場合は、規則に従うアクションとデフォルト ルートのみが制限されます。

例えば:

public IEnumerable<Carrier> GetAll(){
   //this will get called when using the route: /api/carriers/
}

public IEnumerable<Carrier> Get(string id){
   //this will be called when using the route: /api/carriers/1
   //where 1 is the carrier id
}

どちらも規則とルートに沿っているため、CarrierController で機能します。

ここで、配送業者のすべてのアイテムを返すメソッドが必要な場合は、次のメソッドが必要になります。

[ActionName("getItems")]
public IEnumerable<Item> GetAllItems(string id){
   //where id is the carrierid       
   var carrierId = id;
   //because you are specifying the ActionName to getItems this will match the following route: 
   // /api/carriers/getItems/1
}

もう 1 つのオプションは、ItemsController を作成し、carrierId に基づいてアイテムのリストを返すアクションを追加することです。これは概念的にはおそらく優れていますが、ルーティングの原則は同じです。

于 2013-08-29T14:57:43.617 に答える