ASP.NET Core 2.1: Улучшения WebAPI
WebDEV![](/file/caf3e290a7495904e6654.png)
Атрибут [ApiController]
ASP.NET Core 2.1 добавляет атрибут [ApiController], который упрощает разработку WebAPI контроллеров. Данный атрибут предназначен для класса контроллера и обеспечивает:
- Создание ответа с HTTP кодом 400 при ошибке валидирования модели
- Автоматическое добавление атрибутов для параметров действий контроллера:
- [FromBody] для комплексных типов;
- [FromRoute] где это возможно, исходя из настроек маршрутов;
- [FromQuery] в остальных случаях.
Для корректной работы [ApiController] требуется задание маршрутов с использованием атрибутов.
ActionResult<T>
Новый тип ActionResult<T> позволяет вернуть как обобщенный ответ (например с кодом 404), так и значение заданного типа. Например:
![](/file/dc13ddfc87233d756b859.png)
В данном примере действие может вернуть экземпляр типа 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." ] }
Валидация параметров запроса
Теперь можно добавлять атрибуты валидации непосредственно в сигнатуре Действия. Например:
![](/file/ac2cf069a88c8cb43aeb2.png)
Поддержка Problem Details (RFC 7808)
В ASP.NET Core 2.1 появилась поддержка RFC 7808 – Problem Details for HTTP APIs – стандарта, который определяет формат возвращаемого сообщения об ошибках HTTP API. Для использования этой возможности необходимо добавить следующий код в метод ConfigureServices:
![](/file/a57052cf66c09d222eaf3.png)
Другой вариант – вернуть результат вызова 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 для проверки на наличие заданных значений перед выполнением обновления. Например:
![](/file/6b7496a1e3e8ac8a1459a.png)
Следующий запрос успешно выполнит обновление данных.
[ { "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!" } ]