web-dev-qa-db-ja.com

複数のGetステートメントを宣言するAPIコントローラー

MVC4で新しいApiコントローラーを使用すると、問題が見つかりました。次の方法がある場合:

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

これは動作します。ただし、異なるタイプの異なるデータを取得する場合は、GetAllメソッドに_$.getJSON_が設定されていても、デフォルトでGetAllIntegersメソッドになります。

public IEnumberable<int> GetAllIntergers()

(悪い命名規則)

私がこれを行うことは可能ですか?

Web APIコントローラーに単一のGetAllメソッドしか持てませんか?

私が達成しようとしていることを視覚化する方が簡単だと思います。以下に、私ができることを1つのApiControllerで示すコードのスニペットを示します。

_public IEnumerable<string> GetClients()
{ // Get data
}

public IEnumerable<string> GetClient(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMember(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMembers()
{ // Get data
}
_
42
Neil Knight

これはすべてルーティングにあります。デフォルトのWeb APIルートは次のようになります。

config.Routes.MapHttpRoute( 
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
);

デフォルトのルーティングテンプレートでは、Web APIはHTTPメソッドを使用してアクションを選択します。結果として、パラメータなしのGETリクエストを、最初に検出できるGetAllにマップします。これを回避するには、アクション名が含まれるルートを定義する必要があります。

config.Routes.MapHttpRoute( 
   name: "ActionApi", 
   routeTemplate: "api/{controller}/{action}/{id}", 
   defaults: new { id = RouteParameter.Optional } 
);

その後、次のURLでリクエストにスターを付けることができます。

  • api/yourapicontroller/GetClients
  • api/yourapicontroller/GetStaffMembers

このようにして、コントローラーに複数のGetAllを含めることができます。

ここでもう1つ重要なことは、このスタイルのルーティングでは、属性を使用して許可されるHTTPメソッド([HttpGet]など)を指定する必要があるということです。

また、デフォルトのWeb API動詞ベースのルーティングを従来のアプローチと組み合わせるオプションもあります。これについては、以下で詳しく説明します。

63
tpeczek

他の誰かがこの問題に直面した場合に備えて。これは私がこれをどのように解決したかです。特定のURLにルーティングするには、コントローラーの[Route]属性を使用します。

[Route("api/getClient")]
public ClientViewModel GetClient(int id)

[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()
9
Archna