Маршруты можно модифицировать также с применением атрибутов методов HTTP, а не атрибута Route
. Например, ниже показан необязательный маркер маршрута id
, добавленный в шаблон маршрута для обоих методов Delete()
:
[Route("[controller]/[action] ")]
public class CarController : Controller
{
[HttpGet("{id?}")]
public IActionResult Delete(int? id)
{
...
}
[HttpPost("{id}")]
public IActionResult Delete(int id, Car recordToDelete)
{
...
}
}
Маршруты можно перезапускать с использованием методов HTTP; понадобится просто предварить шаблон маршрута символом прямой косой черты (/
), как демонстрируется в следующем примере:
[HttpGet("/[controller]/[action]/{makeId}/{makeName}")]
public IActionResult ByMake(int makeId, string makeName)
{
ViewBag.MakeName = makeName;
return View(_repo.GetAllBy(makeId));
}
На заметку! Если метод действия не декорирован каким-либо атрибутом метода HTTP, то по умолчанию принимается метод GET
. Тем не менее, в веб-приложениях MVC непомеченные методы действий могут также реагировать на запросы POST
. По этой причине рекомендуется явно помечать все методы действий подходящим атрибутом метода HTTP.
Маршрутизация для служб API
Существенное различие между определениями маршрутов, которые применяются для приложений в стиле MVC, и определениями маршрутов, которые используются для служб REST, заключается в том, что в определениях маршрутов для служб не указываются методы действий. Методы действий выбираются на основе метода HTTP запроса (и необязательно типа содержимого), но не по имени. Ниже приведен код контроллера API с четырьмя методами, которые все соответствуют одному и тому же шаблону маршрута. Обратите внимание на атрибуты методов HTTP:
[Route("api/[controller]")]
[ApiController]
public class CarController : ControllerBase
{
[HttpGet("{id}")]
public IActionResult GetCarsById(int id)
{
...
}
[HttpPost]
public IActionResult CreateANewCar(Car entity)
{
...
}
[HttpPut("{id}")]
public IActionResult UpdateAnExistingCar(int id, Car entity)
{
...
}
[HttpDelete("{id}")]
public IActionResult DeleteACar(int id, Car entity)
{
...
}
}
Если метод действия не имеет атрибута метода HTTP, то он трактуется как конечная точка приложения для запросов GET
. В случае если запрос соответствует маршруту, но метод действия с корректным атрибутом метода HTTP отсутствует, тогда сервер возвратит ошибку 404 (не найдено).
На заметку! Инфраструктура ASP.NET Web API позволяет не указывать метод HTTP для метода действия, если его имя начинается с Get
, Put
, Delete
или Post
. Следование такому соглашению обычно считалось плохой идеей и в ASP.NET Core оно было удалено. Если для метода действия не указан метод HTTP, то он будет вызываться с применением НТТР-метода GET
.
Последним селектором конечных точек для контроллеров API является необязательный атрибут Consumes
, который задает тип содержимого, принимаемый конечной точкой. В запросе должен использоваться соответствующий заголовок content-type
, иначе будет возвращена ошибка 415 Unsupported Media Туре (неподдерживаемый тип носителя). Следующие два примера конечных точек внутри одного и того же контроллера проводят различие между JSON и XML:
[HttpPost]
[Consumes("application/json")]
public IActionResult PostJson(IEnumerable
Ok(new { Consumes = "application/json", Values = values });
[HttpPost]
[Consumes("application/x-www-form-urlencoded")]
public IActionResult PostForm([FromForm] IEnumerable
Ok(new { Consumes = "application/x-www-form-urlencoded", Values = values });
Перенаправление с использованием маршрутизации