Содержание
- Метод BadRequest() класса Results
- Метод Conflict() класса Results
- Метод Forbid() класса Results
- Метод NotFound() класса Results
- Метод Unauthorized() класса Results
- Метод UnprocessableEntity() класса Results
- Метод ValidationProblem() класса Results
- Методы BadRequest(), Conflict(), Forbid(), NotFound(), Unauthorized(), UnprocessableEntity() и ValidationProblem() класса TypedResults
- Итого
Отправка кодов состояния HTTP 4xx свидетельствует о том, что произошла ошибка на стороне клиента — ресурс не найден, пользователь не авторизован и т.д. В статических классах Results и TypedResults предусмотрен ряд методов, отправляющих клиенту наиболее распространенные коды статуса HTTP группы 4xx.
Метод BadRequest() класса Results
Этот метод отправляет клинту код статуса 400 Bad Request, который, обычно, говорит о том, что в запросе клиента допущена синтаксическая ошибка.
| Метод | Описание параметров |
public static IResult BadRequest (object? error = default); |
|
public static IResult BadRequest<TValue> (TValue? error); |
|
Пример использования метода
app.MapGet("/age/{age}", (int age) =>
{
if (age < 18)
return Results.BadRequest(new { ErrorCode = 1001, Text = $"Вам {age} лет. Доступ запрещен" });
else
return Results.Content("Добро пожаловать");
});
в данном случае, если в параметрах маршрута будет задано число меньше 18, то сервер вернет код статуса 400
Метод Conflict() класса Results
Метод отправляет клиенту код статуса 409 Conflict, указывающий, что запрос не может быть выполнен из-за конфликтного обращения к ресурсу, например, если сразу два клиента пытаются изменить запись в БД.
| Метод | Описание параметров |
public static IResult Conflict (object? error = default); |
|
public static IResult Conflict<TValue> (TValue? error); |
|
Как и предыдущий метод, Conflict() может принимать в качестве параметра некий объект, содержащий описание проблемы, который будет сериализирован в JSON и отправлен в теле ответа. При этом, объект error можно не указывать.
app.MapGet("/conflict", ()=>Results.Conflict());
Метод Forbid() класса Results
Этот метод отправляет клиенту код статуса 403 Forbidden, сообщающий о том, что пользователь не уполномочен выполнять этот запрос, например, из-за отсутствия авторизации или других ограничений.
| Метод | Описание параметров |
public static IResult Forbid (AuthenticationProperties? properties = default, IList<string>? authenticationSchemes = default);
|
|
Использование этого метода мы пока отложим, так как на данный момент мы не разбирали вопросов, связанных с авторизацией, а работа этого метода напрямую связана с сервисом авторизации.
Метод NotFound() класса Results
Этот метод возвращает самую распространенный код статуса HTTP — 404 Not Found, который сообщает нам о том, что запрошенный ресурс не найден.
| Метод | Описание параметров |
public static IResult NotFound (object? value = default); |
|
public static IResult NotFound<TValue> (TValue? value); |
|
например:
app.MapGet("/resource", () => Results.NotFound(new { ErrorCode = 1002, Details = "Resource not found"}));
Этот метод отправляет клиенту код статуса 401 Unauthorized, который сообщает о том, что пользователь не уполномочен выполнять действия с ресурсом так как он не авторизован.
| Метод | Описание параметров |
public static IResult Unauthorized (); |
Этот метод не принимает никаких параметров. Пример использования
app.MapGet("/resource", (string token)=>
{
if (token != "asdf")
return Results.Unauthorized();
else
return Results.Ok();
});
Метод UnprocessableEntity() класса Results
Этот метод возвращает клиенту код статуса 422 Unprocessable Entity, сообщающий, что сервер успешно принял запрос и может работать с указанным видом данных, однако имеется какая-то логическая ошибка, из-за которой невозможно произвести операцию над ресурсом.
| Метод | Описание параметров |
public static IResult UnprocessableEntity (object? error = default); |
|
public static IResult UnprocessableEntity<TValue> (TValue? error); |
|
Например,
app.MapGet("/resource/{path_token}", (string token, string path_token) =>
{
if (token != path_token)
return Results.UnprocessableEntity(new { message="Токены в пути и параметре не совпадают"});
else
return Results.Ok();
});
Метод ValidationProblem() класса Results
Этот метод, как и BadRequest возвращает клиенту код статуса 400, но, при этом, включает в тело ответа специальный объект в формате JSON — ProblemDetails
| Метод | Описание |
public static IResult ValidationProblem (IDictionary<string,string[]> errors, string? detail = default, string? instance = default, int? statusCode = default, string? title = default, string? type = default, IDictionary<string,object?>? extensions = default); |
|
Пример использования метода
app.MapGet("/resource/{path_token}", (string token, string path_token) =>
{
if (token != path_token)
{
Dictionary<string, string[]> errors = new();
errors.Add("1", new[] { "Ошибка валидации объекта" });
return Results.ValidationProblem(errors, //словарь с ошибками
"Во время валидции модели мы обнаружили ошибку", //подробное описание
null,
400, //код статуса
"Кратко об ошибка");
}
else
return Results.Ok();
});
Как и метод StatusCode, который мы уже рассматривали, метод ValidationProblem может возвращать любой код статуса HTTP, например, выше мы использовали код 400, хотя могли использовать и любой другой.
Методы BadRequest(), Conflict(), Forbid(), NotFound(), Unauthorized(), UnprocessableEntity() и ValidationProblem() класса TypedResults выполняют те же самые операции, что и в классе Results и, при этом, возвращают следующие типизированные результаты:
| Метод | Тип возвращаемого объекта |
BadRequest() |
BadRequest |
Conflict() |
Conflict |
Forbid() |
ForbidHttpResult |
NotFound() |
NotFound |
Unauthorized() |
UnauthorizedHttpResult |
UnprocessableEntity() |
UnprocessableEntity |
ValidationProblem() |
ValidationProblem |
Итого
Статические классы Results и TypedResults предоставляют сразу ряд методов, отправляющих коды состояния HTTP группы 4хх, сообщающих нам о том, что на стороне клиента произошла какая-либо ошибка. При этом, работа метода Forbid() напрямую зависит от настроек сервиса авторизации.





