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
}
_
これはすべてルーティングにあります。デフォルトの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でリクエストにスターを付けることができます。
このようにして、コントローラーに複数のGetAll
を含めることができます。
ここでもう1つ重要なことは、このスタイルのルーティングでは、属性を使用して許可されるHTTPメソッド([HttpGet]など)を指定する必要があるということです。
また、デフォルトのWeb API動詞ベースのルーティングを従来のアプローチと組み合わせるオプションもあります。これについては、以下で詳しく説明します。
他の誰かがこの問題に直面した場合に備えて。これは私がこれをどのように解決したかです。特定のURLにルーティングするには、コントローラーの[Route]属性を使用します。
[Route("api/getClient")]
public ClientViewModel GetClient(int id)
[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()