Лучшая практика для управления версиями ресурсов REST - помещать информацию о версии в заголовки Accept / Content-Type HTTP-запроса, оставляя URI неизменным.
Вот пример запроса / ответ на REST API для получения системной информации:
==>
GET /api/system-info HTTP/1.1
Accept: application/vnd.COMPANY.systeminfo-v1+json
<==
HTTP/1.1 200 OK
Content-Type: application/vnd.COMPANY.systeminfo-v1+json
{
“session-count”: 19
}
Обратите внимание, что версия указана в типе MIME.
Вот еще один запрос / ответ для версии 2:
==>
GET /api/system-info HTTP/1.1
Accept: application/vnd.COMPANY.systeminfo-v2+json
<==
HTTP/1.1 200 OK
Content-Type: application/vnd.COMPANY.systeminfo-v2+json
{
“uptime”: 234564300,
“session-count”: 19
}
См. http://barelyenough.org/ blog / tag / rest-versioning / для получения дополнительных объяснений и примеров.
Можно ли легко реализовать этот подход в реализациях на основе JAX-RS, ориентированных на Java, таких как Jersey или Apache CXF?
Цель состоит в том, чтобы иметь несколько классов @Resource с одинаковым значением @Path, но обслуживающих запрос на основе фактической версии, указанной в типе MIME?
Я изучил JAX-RS в целом и Джерси в частности и не нашел для этого поддержки. Джерси не дает возможности зарегистрировать два ресурса с одним и тем же путем. Для поддержки этого необходимо реализовать замену для класса WebApplicationImpl.
Можете ли вы что-нибудь предложить?
ПРИМЕЧАНИЕ: Это необходимо, чтобы несколько версий одного и того же ресурса были доступны одновременно. В новых версиях могут быть внесены несовместимые изменения.