2016-09-15 7 views
1

Web Apiのベストプラクティスを使用してRESTサービスを作成しようとしていますが、どのように処理するのかわかりません。異なるアクションを同じ署名を持つWeb APIメソッドにマップする方法

私はグループがあり、各グループにはユーザーがいるとします。あなたが見ることができるように、我々は同じクラスで同じシグネチャを持つ2つのメソッドを持つことができないので、私の第二の方法はコンパイルされません

[RoutePrefix("api/v1/groups")] 
public class GroupsController : ApiController 
{ 
    [HttpGet] 
    [Route("{id:int}")] 
    public IHttpActionResult Get(int id) 
    { 
     return Ok(); 
    } 

    // I also want to add endpoint which fetches all the users inside of group and I'd like to do it like this: 
    [HttpGet] 
    [Route("{id:int}/users")] 
    public IHttpActionResult Get(int id) 
    { 
     return Ok(); 
    } 
} 

これは私のGroupControllerがどのように見えるかです。

マイルートテンプレートは、スタンダール1のようになります。

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

私はまた、アクションメソッド名をマッピングしますが私の目標を達成するためのより良い方法があります場合、私は思っていたルートを追加することができます知っています。 RESTfulなサービスを書くための最善の原則に固執したいと思います。私が知っているように、提案の1つは、カスタムアクション名を避けることです。なぜなら、これはWCFサービスでより一般的であるからです。

答えて

3

MapHttpRoute()スタイルルーティング構成と属性ベースルーティングを混在させないでください。どちらか一方を使用する方が簡単です(私は属性ベースを優先して明示的に指定し、クラスのメソッド名を明確にすることができます)。

あなたの設定で属性ベースのルーティングを有効にするために必要なメソッドも呼び出されていないようです - config.MapHttpAttributeRoutes()

最後に、メソッドのシグネチャには衝突がないことを確認するために、次のように私はあなたのメソッドの名前を変更したい:GetGroups(int id)GetUsersForGroup(int id)

+0

をので、私はに移動して、「GetUsersForGroup(int型のID)」をヒットすることができるだろうapi/v1/groups/1/usersforgroup? – user2128702

+0

いいえ、属性のパスは 'api/v1/groups/1/users'です。これは、ルートがメソッド名に依存しないので、属性ルーティングを優先させる理由です。 – toadflakz

+0

私はそれが "GetUsers(int id)"メソッドをヒットすることを意味し、実際にはそうです。そういうわけで私はあなたの答えを答えにしました。 – user2128702

関連する問題