10

私は新しい Web API 2 (非常に有望に見えます) で遊んでいますが、いくつかのルートを機能させるのに少し頭が痛いです。GetAllUsers / GetUser(int id) がある場合はすべて正常に動作しますが、GetUserByName(string name) および/または GetUserByUsername(string username) を追加すると、気味が悪くなり始めます。int が最初のものであり、ルートを並べ替えることができることはわかっていますが、次のシナリオを想像してみましょう。

ユーザーは有効なusername=1234orを持つことができname=1234(可能性は低いと思いますが、考えられる状況を防ぐ必要があります)、データベースに有効な 1234 ID があり、すべてのルートが混同される可能性があります。

api/users/?username=1234おそらくこれは、新しい WebAPI 2 で作業する必要があるものなので、 (GetUserByUsername) やapi/users/?name=1234(GetUserByName )など、同じコントローラー内の異なるアクションを対象とするクエリ文字列としてフィルターを渡す「回避策」を用意できると考えました。

しかし、クエリ文字列を通過させることはできません...実際には、上記のクエリ文字列オプションはすべて、GetAllUsers によってキャッチされています。

そのシナリオの提案/修正はありますか?

どうもありがとう

4

1 に答える 1

13

のようにメソッドアクセス名を定義する必要があります

[HttpGet("User")]
public async Task<UserViewModel> GetByName(string name)
[HttpGet("User")]
public async Task<UserViewModel> GetByUserName(string name)

//You can access like 
//- api/Users/User?name=someneme
//- api/Users/User?username=someneme

また

[HttpGet("User")]
public async Task<UserViewModel> GetByAnyName(string name="", string username="")
//- api/Users/User?name=someneme
//- api/Users/User?username=someneme
//- api/Users/User?username=someneme&name=someone

更新され た上記の両方は、ルートプレフィックスの他の構成でうまく機能します。

また

[HttpGet("")]
public async Task<UserViewModel> GetAll()
[HttpGet("")]
public async Task<UserViewModel> Get(int id)
[HttpGet("")]
public async Task<UserViewModel> GetByName(string name)
[HttpGet("")]
public async Task<UserViewModel> GetByUserName(string name)

//You can access like 
//- api/Users/
//- api/Users/?id=123
//- api/Users/?name=someneme
//- api/Users/?username=someneme
于 2013-10-16T07:26:11.423 に答える