asp.net-web-api
Маршрутизация URL-адресов веб-API
Поиск…
Как работает маршрутизация в asp.net webapi
В ASP.NET Web API контроллер - это класс, который обрабатывает HTTP-запросы. Публичные методы контроллера называются методами действий или просто действиями.
Когда веб-интерфейс API получает запрос, он направляет запрос на действие. Чтобы определить, какое действие нужно вызвать, среда использует таблицу маршрутизации. Шаблон проекта Visual Studio для Web API создает маршрут по умолчанию:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "**api/{controller}/{id}**",
defaults: new { id = RouteParameter.Optional }
);
Этот маршрут определен в файле WebApiConfig.cs, который помещается в каталог App_Start:
Каждая запись в таблице маршрутизации содержит шаблон маршрута. Шаблон маршрута по умолчанию для веб-API - « api / {controller} / {id} ». В этом шаблоне « api » является литеральным сегментом пути, а { controller } и { id } являются переменными-заполнителями.
Когда веб-интерфейс API получает HTTP-запрос, он пытается сопоставить URI с одним из шаблонов маршрутов в таблице маршрутизации. Если маршрут не совпадает, клиент получает ошибку 404.
Например, следующие URI соответствуют маршруту по умолчанию:
- / API / значения
- / API / значения / 1
Однако следующий URI не соответствует, поскольку ему не хватает сегмента api :
- / Значения / 1
Как только найден соответствующий маршрут, Web API выбирает контроллер и действие:
- Чтобы найти контроллер, Web API добавляет «Контроллер» к значению переменной {controller}.
- Чтобы найти действие, веб-API просматривает метод HTTP, а затем ищет действие, имя которого начинается с имени этого метода HTTP. Например, с помощью запроса GET веб-API ищет действие, начинающееся с «Get ...», например «GetEmployee» или «GetAllEmployees». Это соглашение применяется только к методам GET, POST, PUT и DELETE.
Вы можете включить другие методы HTTP, используя атрибуты на вашем контроллере. Мы увидим пример этого позже.
- Другие переменные-заполнители в шаблоне маршрута, такие как {id}, сопоставляются с параметрами действия.
Методы HTTP Вместо использования соглашения об именах для методов HTTP вы можете явно указать метод HTTP для действия, украсив метод действия атрибутом HttpGet, HttpPut, HttpPost или HttpDelete.
В следующем примере метод EmployeeGetEmployee сопоставляется с запросами GET:
public class EmployeesController : ApiController
{
[HttpGet]
public EmployeeGetEmployee(id) {}
}
Чтобы разрешить несколько HTTP-методов для действия или разрешить HTTP-методы, отличные от GET, PUT, POST и DELETE, используйте атрибут AcceptVerbs, который принимает список методов HTTP.
public class EmployeesController: ApiController
{
[AcceptVerbs("GET", "HEAD")]
public Employee GetEmployee (id) { }
}
Маршрутизация по названию действия
При использовании шаблона маршрутизации по умолчанию Web API использует метод HTTP для выбора действия. Однако вы также можете создать маршрут, в котором имя действия включено в URI:
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
В этом шаблоне маршрута параметр {action} называет метод действия на контроллере. С помощью этого стиля маршрутизации используйте атрибуты для указания разрешенных методов HTTP. Например, предположим, что ваш контроллер имеет следующий метод:
public class EmployeesController: ApiController
{
[HttpGet]
public List<Employee> GetAllEmployees();
}
В этом случае запрос GET для « api / Employees / GetAllEmployees » будет отображаться в методе GetAllEmployees.
Вы можете переопределить имя действия с помощью атрибута ActionName. В следующем примере есть два действия, которые отображаются на « api / Employees / ShowAllEmployees / id» . Один поддерживает GET, а другой поддерживает POST:
public class EmployeesController : ApiController
{
[HttpGet]
[ActionName("ShowAllEmployees")]
public List<Employee> GetAll(int id);
[HttpPost]
[ActionName("ShowAllEmployees")]
public void GetAll (int id);
}
Non-действия
Мы можем запретить вызов метода в качестве действия с использованием атрибута NonAction. Это сигнализирует структуре, что метод не является действием, даже если он в противном случае соответствовал правилам маршрутизации.
[NonAction]
public string GetValues() { ... }
Примеры маршрутизации на основе глаголов.
Тот же URl для разных методов http действует по-разному. Ниже приведена таблица, изображающая то же самое.
| HTTP VERB | URL | ОПИСАНИЕ |
|---|---|---|
| ПОЛУЧИТЬ | / API / студентов | Возвращает всех студентов |
| ПОЛУЧИТЬ | / API / студентов / 5 | Возвращает данные студента Id = 5 |
| СООБЩЕНИЕ | / API / студентов | Добавить нового ученика |
| ПОЛОЖИЛ | / API / студентов / 5 | Обновить ученика с Id = 5 |
| УДАЛЯТЬ | / API / студентов / 5 | Удалить ученика с Id = 5 |