Контроллер Api, объявляющий более одного оператора Get
Использование нового Api Controller в MVC4, и я нашел проблему. Если у меня есть следующие методы:
public IEnumberable<string> GetAll()
public IEnumberable<string> GetSpecific(int i)
Это сработает. Однако, если я хочу получить некоторые разные данные другого типа, по умолчанию используется метод GetAll
, даже если для параметра $.getJSON
установлен метод GetAllIntegers
:
public IEnumberable<int> GetAllIntergers()
(плохие соглашения об именах)
Возможно ли, чтобы я мог это сделать?
Можно ли использовать только один метод GetAll
в контроллере Web API?
Мне кажется, что легче понять, чего я пытаюсь достичь. Вот фрагмент кода, чтобы показать, что я хотел бы сделать, в одном 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
}
Ответы
Ответ 1
Это все в маршрутизации. Маршрут 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-адресами:
- API/yourapicontroller/GetClients
- API/yourapicontroller/GetStaffMembers
Таким образом, вы можете иметь несколько GetAll
в контроллере.
Еще одна важная вещь в том, что с этим стилем маршрутизации вы должны использовать атрибуты для указания допустимых методов HTTP (например, [HttpGet]).
Существует также возможность смешивания маршрутизации по умолчанию, основанной на веб-API по умолчанию, с традиционным подходом, это очень хорошо описано здесь:
Ответ 2
Если кто-то сталкивается с этой проблемой. Вот как я это решил. Используйте атрибут [Маршрут] на вашем контроллере для перехода к определенному URL-адресу.
[Route("api/getClient")]
public ClientViewModel GetClient(int id)
[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()