Сначала я выполнил поиск в stackoverflow, и я не смог найти ответы на мои вопросы. Все, что я могу найти, это вопросы, связанные с дизайном REST uri.
Мой вопрос на стороне сервера. Предположим, у нас есть две разные версии REST uri
http://api.abc.com/rest/v1/products
http://api.abc.com/rest/v2/products
Каков наилучший подход к поддержке на стороне сервера (серверный код) для правильной маршрутизации, управления и повторного использования существующих классов в этих двух наборах api на основе версии?
Я думал о подходе к определению классов ресурсов с различными аннотациями @Path, например. иметь пакет для v1 и v2 отдельно и в классе ProductsResource этого пакета, определить
package com.abc.api.rest.v1.products;
@Path("/rest/v1/products")
public class ProductsResource {...}
package com.abc.api.rest.v2.products;
@Path("/rest/v2/products")
public class ProductsResource {...}
& то есть логика реализации на основе версий. Проблемы с этим подходом состоят в том, что когда мы изменяем только один ресурс api из набора api, нам также нужно скопировать другие классы в пакет v2. Мы можем избежать этого?
Как написать пользовательскую аннотацию, скажем @Version и иметь значения поддерживаемых ею версий? Теперь, будь то v1 или v2, оба запроса перейдут в тот же класс ресурсов.
Скажите, например,
package com.abc.api.rest.products;
@Path("/rest/{version: [0-9]+}/products")
@Version(1,2)
public class ProductsResource {...}
UPDATE:
В Jarrod было предложено управление версиями API, чтобы обрабатывать версию в заголовках. Это также один из способов сделать это, однако, я с нетерпением жду лучших практик, которые будут использоваться, когда мы будем следить за версиями, основанными на URI.