Web API 2/MVC 5: атрибут Маршрутизация передаёт параметры в качестве последовательности запросов для разных действий на одном контроллере
Я играю с новым Web API 2 (который выглядит очень многообещающе), но у меня немного головная боль, чтобы работать с некоторыми маршрутами.
Все работает отлично, когда у меня есть GetAllUsers/GetUser (int id), но тогда, когда я добавляю GetUserByName (имя строки) и/или GetUserByUsername (имя пользователя строки), все становится жутким. Я знаю, что int будет первым и что я могу повторно заказать маршруты, но представьте себе следующий сценарий:
Пользователь может иметь действительный username=1234
или name=1234
(я знаю, что это маловероятно, но нам нужно предотвратить любую возможную ситуацию), и у нас может быть действительный 1234 ID в базе данных, и все маршруты будут замешаны.
Возможно, это то, что нам нужно будет работать с новым WebAPI 2, поэтому я подумал, что могу использовать фильтры "обходного пути" в качестве querystrings для задания разных действий в одном контроллере, например api/users/?username=1234
(GetUserByUsername ) или api/users/?name=1234
(GetUserByName)
Но я не могу сделать querystrings, чтобы пройти через... на самом деле любая опция querystring выше попадает в GetAllUsers.
Есть ли у кого-нибудь предложение/исправление для этого сценария?
Спасибо большое
Ответы
Ответ 1
Вам нужно определить имя доступа к методу, например
[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