ASP.NET Core — создание API, маршруты, передача данных
В данной статье я хочу показать, как можно создавать API в ASP.NET Core. Для начала хочу обратить внимание на один момент, в предыдущей версии ASP.NET существует разграничение между ASP.NET Web API и ASP.NET MVC. В ASP.NET Core всё это объединено в ASP.NET Core MVC, все контроллеры наследуются от Microsoft.AspNetCore.Mvc.Controller
.
Чтобы начать работать с ASP.NET Core MVC необходимо зайти в файл Startup.cs
и в методе ConfigureServices
добавить services.AddMvc();
В методе Configure
добавить app.UseMvc();
Чтобы настроить маршрутизацию вы можете использовать маршрутизацию на основе соглашений и маршрутизацию на основе атрибутов. Использование смешанной маршрутизации так же допускается. Например:
1 2 3 4 5 6 |
|
Можно обойтись без параметра defaults
, записав как:
1 2 3 4 5 |
|
Если рассмотреть это немного детальнее, то здесь:
{controller=Home
} определяетHome
в качестве объектаcontroller
по умолчанию.{action=Index}
определяетIndex
в качестве объектаaction
по умолчанию.{id?}
определяет необязательный параметрid
. Убрав?
параметр станет обязательным.
Данный маршрут очень распространён и, фактически, является стандартом. Из за этого появился новый метод: app.UseMvcWithDefaultRoute();
Он равносилен вышеописанному маршруту.
Код самого метода можно посмотреть здесь: https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Core/Builder/MvcApplicationBuilderExtensions.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Маршрутизация с помощью атрибутов
Атрибуты можно добавлять как непосредственно на сам метод
1 2 3 4 5 6 |
|
Так и на контроллер целиком, тогда итоговый маршрут к методу будет включать заданный в атрибуте для контроллера и заданный непосредственно в самом методе:
1 2 3 4 5 6 7 8 9 |
|
Если же вы хотите, чтобы использовалось имя вашего контроллера и его не нужно было бы менять в маршруте, например, когда сам контроллер изменит имя, то можно прописать [controller]
в маршруте.
1 2 3 4 5 6 7 8 9 |
|
Маршрутизация с помощью атрибутов Http[Verb]
Вы можете пометить, какой тип HTTP запроса будет использовать ваш метод. Можно использовать атрибуты HttpGet
, HttpPost
, HttpPut
, HttpPatch
, HttpDelete
1 2 3 4 5 6 |
|
Сейчас давайте добавим новый контроллер UserController
, который будет использоваться в качестве API для получения данных пользователей.
1 2 3 4 5 6 7 8 9 10 |
|
Чтобы не добавлять работу с базой данных на данном этапе, добавлю данный класс, который будет содержать некоторые данные пользователей:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
Выполнив GET запрос /api/users в ответ получу список всех пользователей
Добавлю метод для получения данных о конкретном пользователе, указав его идентификатор
1 2 3 4 5 6 |
|
Теперь, выполнив запрос /api/users/1 получим в результате
Сейчас, если ввести идентификатор пользователя которого нет, то в ответ вернёт пустое значение с 204 кодом (No Content). Чтобы возвращало ответ с 404 кодом, можно воспользоваться методом NotFound()
1 2 3 4 5 6 7 8 9 10 |
|
Результат:
Здесь стоит обратить внимание, что само сообщение об ошибке не было передано, так как по умолчанию не будет предоставляться страница для их отображения. Чтобы начать их отображать достаточно в конфигурацию добавить app.UseStatusCodePages();
По умолчанию в ASP.NET Core данные сериализуются и десериализуются в JSON, но вы легко можете использовать другие форматы, например, XML. Для этого необходимо добавить новый OutputFormatters
для XML это будет XmlDataContractSerializerOutputFormatter
. Это позволит в отдаваемых данных использовать XML
1 2 |
|
В таком виде, если мы не удаляем работу с JSON, а добавляем XML, то будет использоваться принцип согласования контента. При обработке входящих данных будет использоваться Content-type заголовок, для исходящих данных заголовок Accept
Также всё это можно настраивать. Например, вы могли заметить, что в JSON имена переменных начинаются с маленькой буквы, тогда как в модели они большие. Если для вас это критично, можете изменить эту логику, делается это следующим образом.
1 2 3 4 5 6 7 8 9 |
|
Результат будет следующим:
Итог:
Был рассмотрен минимальный функционал, позволяющий создавать удобные API. Используя возможности ASP.NET Core MVC вы можете настраивать возможности под требуемые задачи. Для построения грамотных систем необходимо использовать возможности маршрутизации. Можно использовать маршрутизацию на основе соглашений и атрибутов. Если вы можете работать с различными форматами данных, то будет использоваться согласование контента, на основе заголовков, позволяя пользователю вашего API получать данные в нужном ему формате.
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.