0

私はASP .Net Core 1.1 Web APIを持っています。私のコントローラの一つで、私は2つのアクションを希望:別のものと同じ署名を持つWeb APIアクションを呼び出す

[HttpGet("{userId:int}")] 
public async Task<IActionResult> GetUser([FromRoute] int id) 
{ 
    return Ok(_context.User.Where(u.Id == id)); 
} 

[HttpGet("{groupId:int}")] 
public async Task<IActionResult> GetUsersInGroup([FromRoute] int groupId) 
{ 
    return Ok(_context.User.Where(u.GroupId == groupId)); 
} 

どちらのアクションでも、メソッド名を除いて、同じシグネチャを持っています。どうすれば私はどちらかを呼び出すことができますか?

ありがとう...

答えて

1

ルーティングコンポーネントの観点から考えてみましょう。 /api/users/123のようなURLを受信し、コントローラで上記の操作を行った場合はどうなりますか?

あなたはそれらを区別する必要があります。属性:

[Route("api/users")] 
public class UsersController : Controller 
{ 
    [HttpGet("{userId:int}")] 
    public async Task<IActionResult> GetUser([FromRoute] int userId) 
    { 
     return Ok(_context.User.Where(u.Id == userId)); 
    } 

    [HttpGet("group/{groupId:int}")] 
    public async Task<IActionResult> GetUsersInGroup([FromRoute] int groupId) 
    { 
     return Ok(_context.User.Where(u.GroupId == groupId)); 
    } 
} 

今、彼らがしてアクセスすることができます。

  • /api/users/123
  • /api/users/group/123

コントローラレベルのルート属性を使用するドンので、すべてのルートのための共通の接頭辞を設定しますそれをすべて指定する必要はありません。

次に、HttpGet属性は基本的に異なるルートであるように、追加のプレフィックスを指定します。

+0

ありがとうございます。私は示唆したように - 完璧に動作します! – user1900799

+0

好奇心を要して、クエリ文字列を使用できますか?もしそうなら、それは "unreestful"と見なされますか?たとえば、特定のユーザーを取得するには "/ api/users/123"、グループに属するすべてのユーザーを取得するには "/ api/users?groupId = 5" ... – user1900799

+0

これも可能です。 FromQuery属性IIRCを使用してクエリ値を取得できます。私はあなたがユーザーを探しているが検索パラメータを持っているので、それはまともではないとは思わない。もう一つの選択肢は '/ api/users/123'と'/api/groups/123/members'のようなルートを持つことです。あなたとAPIを使用するすべての人には、どんなものであれ使用してください。 – juunas

関連する問題