Схема управления версиями Rest Api: Resource vs Service - PullRequest
0 голосов
/ 08 ноября 2019

В нашем приложении мы адаптировали схему управления версиями URI.

Например: server.com/v2/resource1

Теперь в команде есть две школы мысли:

  1. Мы не должны предоставлять версию уровня ресурса клиенту, вместо этого мы должны дать им одну версию. Если они вызывают / v2 / resource1, а v2 отсутствует для resource1, то мы должны перенаправить запрос к / v1 / resource1 внутри.

  2. Мы должны предоставить клиенту управление версиями на уровне ресурсов. Если вызовы / v2 / resource1 и v2 отсутствуют для resource1, мы должны отправить клиенту простой ответ об ошибке 404.

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

Второй подход дает нам лучший контроль над инкрементным рефакторингоми четкое понимание версии ресурса с точки зрения клиента.

Мысли?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Версии API IMO должны быть на уровне API (примечание: под API я имею в виду набор ресурсов / маршрутов и их операций). Даже если вам нужно только увеличить версию одной конкретной операции для одного маршрута;все существующие операции API также должны быть доступны с использованием новой версии, например, у вас не должно быть сценария, когда одна операция доступна в /api/v2/template/thing, а вторая операция в том же API доступна только в /api/v1/template/item, а не /api/v2/template/item,Это может привести к путанице среди потребителей API.

Мы используем .NET Core в моей нынешней компании. Для достижения вышеизложенного классы контроллера API помечены атрибутами ApiVersion для всех известных версий. Определенные операции, которые не являются последней версией, помечены атрибутом MapToApiVersion - последние версии операций не помечены определенным MapToApiVersion например,

[ApiVersion("1.0")]
[ApiVersion("2.0")]
[ApiController]
[Route("api/v{version:apiVersion}/template/test")]
public class TestController : ControllerBase
{
   [HttpGet]
   [MapToApiVersion("1.0")]
   public IActionResult Get()
   {
      return Ok(nameof(Get));
   }

   [HttpGet]
   public IActionResult GetV2()
   {
      return Ok(nameof(GetV2));
   }

В приведенном выше примере;операция GetV2 в основном является маршрутом по умолчанию для любой версии, которая явно не обрабатывается, например, HTTP GET для /api/v2/template/test.

Этот подход дает вам преимущество;а) клиенту не нужно беспокоиться о гранулярном уровне управления версиями, и б) он все еще может выполнять поэтапный рефакторинг конечных точек, который не нарушит обратную совместимость.

0 голосов
/ 08 ноября 2019

В соответствии со спецификациями REST, имеющими информацию о версиях в URL, не рекомендуется, поскольку REST URI должен ссылаться на уникальный ресурс. Но эта рекомендация не учитывается почти всеми наиболее популярными API на основе REST.

Чтобы упростить задачу, разверните resource1 в v2, если для него нет новой версии. Если доступна новая версия, разверните ее в версии 2.

Оставьте обе версии работающими и дайте клиентам время на обновление и удаление более старой версии через некоторое время.

...