В течение срока службы вашего API у вас, скорее всего, будут обновления или новые функции. С каждой новой функцией или обновлением вы можете захотеть создать новую версию своего API.

Но как насчет клиентов, которые уже с удовольствием используют ваш существующий API, должны ли они быть вынуждены изменить свой клиентский код, использующий ваш API? Предполагая, что вы по-прежнему хотите поддерживать этих клиентов, не нарушая работу их приложений, вы можете включить управление версиями для новых функций или обновлений.

Microsoft упростила реализацию управления версиями в веб-API: просто добавьте пакет Nuget, настройте его в Startup.cs и добавьте соответствующие атрибуты маршрута в свой контроллер.

Примечание. Моя установка ниже — это .NET Core 3.1 и шаблон проекта API.

  1. Установите nuget управления версиями:
Install-Package Microsoft.AspNetCore.Mvc.Versioning

2. Настройте управление версиями в Startup.cs:

В разделе ConfigureServices добавьте AddApiVersioning — строка 17 в примере ниже.

3. Создайте атрибут маршрута в вашем контроллере:

Сначала мы добавляем атрибут Route для самого контроллера — строка 6 в примере выше:

[Route(“api/v{version:apiVersion}/[controller]/[action]”)]

Это укажет маршрутизатору на конечную точку, например:

http://localhost:{port}/api/v1/creditcard/get

В строках 10 и 28 есть атрибут Action, который сообщает, в какой версии поддерживается метод:

[ApiVersion(“1.0”)] and [ApiVersion(“1.5”)]

В строках 11 и 29 есть атрибут Action, который сообщает маршрутизации, что конечная точка одинакова для обеих версий — это всегда Get. Это необходимо, если вы хотите, чтобы ваши методы находились в одном и том же контроллере, они не могут быть оба названы Get, так как проект не будет компилироваться. Вам нужно переименовать каждый метод Get, я решил добавить суффикс «Vn», где «n» — моя версия API.

[ActionName(“Get”)]

Также обратите внимание, что каждый метод возвращает объект с разными данными (обратите внимание на v1 и v1.5 в URL):

http://localhost:{port}/api/v1/creditcard/get
{"pan":1234567890123456789,
"issuer":"Pisa",
"validUntil":202312,
"nameOnCard":"Ian Fraser Kilmister",
"cvv":123,
"ordered":"2015-12-28T00:00:00"}
http://localhost:{port}/api/v1.5/creditcard/get
{"pan":1900112233445566778,
"issuer":"FasterCard",
"validUntil":202403,
"nameOnCard":"Ronald James Padavona",
"cvv":475,
"ordered":"2010-05-16T00:00:00"}