В течение срока службы вашего API у вас, скорее всего, будут обновления или новые функции. С каждой новой функцией или обновлением вы можете захотеть создать новую версию своего API.
Но как насчет клиентов, которые уже с удовольствием используют ваш существующий API, должны ли они быть вынуждены изменить свой клиентский код, использующий ваш API? Предполагая, что вы по-прежнему хотите поддерживать этих клиентов, не нарушая работу их приложений, вы можете включить управление версиями для новых функций или обновлений.
Microsoft упростила реализацию управления версиями в веб-API: просто добавьте пакет Nuget, настройте его в Startup.cs и добавьте соответствующие атрибуты маршрута в свой контроллер.
Примечание. Моя установка ниже — это .NET Core 3.1 и шаблон проекта API.
- Установите 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"}