Содержание
Отправка кодов состояния HTTP 4xx свидетельствует о том, что произошла ошибка на стороне клиента — ресурс не найден, пользователь не авторизован и т.д. В ASP.NET Core MVC предусмотрен ряд классов, отправляющих клиенту наиболее распространенные коды статуса HTTP группы 4xx.
Классы BadRequestResult и BadRequestObjectResult
Эти классы отправляют клиенту код статуса HTTP 400 Bad Request, свидетельствующий о том, что в запросе допущена синтаксическая ошибка, например, отсутствует необходимый параметр запроса, запрос содержит некорректные данные и т.д. При этом, класса BadRequestObjectResult
возможно указание объекта, который может быть отправлен в теле ответа. Для создания этих классов в классе Controller
предусмотрены следующие методы:
public virtual BadRequestResult BadRequest(); |
|
public virtual BadRequestObjectResult BadRequest(ModelStateDictionary modelState); |
|
public virtual BadRequestObjectResult BadRequest(object? error); |
Пример применения в контроллере:
public IActionResult BadRequestOperation(int param) { if (param <= 0) return BadRequest(new { Error = "Число должно быть больше 0" });//отправляем код 400 else return Ok(); }
результат:
Классы ConflictResult и ConflictObjectResult
Эти классы генерируют в ответ запросу пользователя код статуса 409 Conflict. Этот статусный код, часто отправляется клиенту на PUT-запрос, например, когда на сервер загружается более старый файл, чем уже есть на сервере. Эти классы создаются при выполнении следующих методов класса Controller
:
public virtual ConflictResult Conflict(); |
|
public virtual ConflictObjectResult Conflict(object? error); |
|
public virtual ConflictObjectResult Conflict(ModelStateDictionary modelState); |
Например,
public IActionResult ConflictOperation(int param) { int value = 5; if (param <= value) return Conflict(new { Error = $"Значение param должно быть больше {value}" });//отправляем код 409 else return Ok(); }
Класс ForbidResult
Этот класс отправляет клиенту код статуса HTTP 403 Forbidden, который означает, что сервер понял запрос, но он отказывается его выполнять из-за ограничений в доступе для клиента к указанному ресурсу. Обычно этот код статуса могут увидеть пользователи, которые не прошли аутентификацию. Этот класс создается следующими методами класса Controller
:
public virtual ForbidResult Forbid(); |
|
public virtual ForbidResult Forbid(AuthenticationProperties properties, params string[] authenticationSchemes); |
|
public virtual ForbidResult Forbid(AuthenticationProperties properties); |
|
public virtual ForbidResult Forbid(params string[] authenticationSchemes); |
Работу с этими класса, а также методом Forbid()
мы рассмотрим в теме «Аутентификация и авторизация», так как для корректной отправки этого кода статуса требуются дополнительные настройки нашего проекта о которых мы пока ещё ничего не знаем.
Классы NotFoundResult и NotFoundObjectResult
Эти классы отправляют клиенту, наверное, самый популярный статусный код — 404 Not Found, который сообщает о том, что сервер понял запрос, но не нашёл соответствующего ресурса по указанному URL. Для создания этих классов используются следующие методы класса Controller
:
public virtual NotFoundObjectResult NotFound (object? value); |
|
public virtual NotFoundResult NotFound (); |
Например,
public IActionResult NonFoundOperation() { return NotFound(); }
Эти классы отправляют клиенту код статуса HTTP 401 Unauthorized, который свидетельствует о том, что для доступа к запрашиваемому ресурсу требуется авторизация. Классы создаются следующими методами класса Controller:
public virtual UnauthorizedObjectResult Unauthorized(object? value); |
|
public virtual UnauthorizedResult Unauthorized(); |
Например,
public IActionResult UnauthorizedOperation(int age) { if (age < 18) return Unauthorized(new { Error = "Доступ запрещен. Ограничение 18+"}); else return Ok(); }
Классы UnprocessableEntityResult и UnprocessableEntityObjectResult
Эти классы отправляют клиенту код статуса 422 Unprocessable Entity, который свидетельствует о том, что сервер успешно принял запрос и может работать с указанным видом данных, однако имеется какая-то логическая ошибка, из-за которой невозможно произвести операцию над ресурсом. В основном, такой код HTTP характерен при выполнении операций с базами данных. Объекты этих классов создаются следующими методами класса Controller
:
public virtual UnprocessableEntityResult UnprocessableEntity(); |
|
public virtual UnprocessableEntityObjectResult UnprocessableEntity (ModelStateDictionary modelState); |
|
public virtual UnprocessableEntityObjectResult UnprocessableEntity (object? error); |
Например,
public IActionResult UnprocessableEntityOperation(int age) { if (age < 18) return UnprocessableEntity(new { Error = "Недопустимое значение"}); else return Ok(); }
Итого
ASP.NET Core MVC предоставляет сразу ряд классов, отправляющих коды состояния HTTP группы 4хх, сообщающих нам о том, что на стороне клиента произошла какая-либо ошибка. При этом, работа метода Forbid()
напрямую зависит от настроек сервиса авторизации.