ASP.NET Core 2.1: Улучшения WebAPI

ASP.NET Core 2.1: Улучшения WebAPI

WebDEV

Атрибут [ApiController]

ASP.NET Core 2.1 добавляет атрибут [ApiController], который упрощает разработку WebAPI контроллеров. Данный атрибут предназначен для класса контроллера и обеспечивает:

  • Создание ответа с HTTP кодом 400 при ошибке валидирования модели
  • Автоматическое добавление атрибутов для параметров действий контроллера:
  • [FromBody] для комплексных типов;
  • [FromRoute] где это возможно, исходя из настроек маршрутов;
  • [FromQuery] в остальных случаях.

Для корректной работы [ApiController] требуется задание маршрутов с использованием атрибутов.


ActionResult<T>

Новый тип ActionResult<T> позволяет вернуть как обобщенный ответ (например с кодом 404), так и значение заданного типа. Например:

В данном примере действие может вернуть экземпляр типа User или ответ 404, если данные не найдены.


Улучшенная обработка запроса

Еще одним нововведением в ASP.NET Core 2.1 стали улучшенные сообщения об ошибках обработки данных запроса. Например, если в запросе данные в формате JSON содержали значение неправильного типа, то раньше клиент получал в ответ следующее:

{
  "id": [
    "The input was not valid."
  ]
}



Теперь текст сообщения об ошибке стал более детальным. Для рассориваемого случая он будет выглядеть так:

{
  "id": [
    "Could not convert string to integer: abc. Path 'id', line 1, position 16."
  ]
}



Вот еще один пример ответа с пояснением ошибки:

{
  "": [
    "Unexpected end when reading JSON. Path '', line 1, position 1."
  ]
}




Валидация параметров запроса

Теперь можно добавлять атрибуты валидации непосредственно в сигнатуре Действия. Например:


Поддержка Problem Details (RFC 7808)

В ASP.NET Core 2.1 появилась поддержка RFC 7808 – Problem Details for HTTP APIs – стандарта, который определяет формат возвращаемого сообщения об ошибках HTTP API. Для использования этой возможности необходимо добавить следующий код в метод ConfigureServices:

Другой вариант – вернуть результат вызова ValidationProblem() из самого действия в контроллере.

В любом случае ответ примет следующий вид:

{
  "errors": {
    "Text": [
      "The Text field is required."
    ]
  },
  "type": "https://asp.net/core",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "detail": "Please refer to the errors property for additional details.",
  "instance": "/api/values"
}




Улучшения для JSON Patch

JSON Patch определяет структуру JSON документа для поддержки операции HTTP PATCH (частичной модификации данных). Его поддержка уже существует в ASP.NET Core. В версии 2.1 добавлена возможность использовать операцию ApplyTo для проверки на наличие заданных значений перед выполнением обновления. Например:

Следующий запрос успешно выполнит обновление данных.

[
  { "op": "test", "path": "/text", "value": "Do" },
  { "op": "add", "path": "/status/1", "value": "Done!" }
]

А обработка запроса вот с другими данными закончится ошибкой, т.к. значение свойства Text у переменной value не совпадает с заданным “Do not”:

[
  { "op": "test", "path": "/text", "value": "Do not" },
  { "op": "add", "path": "/status/1", "value": "Done!" }
]


Report Page