Лучшей практикой для управления версиями ресурсов 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/.
Можно ли легко реализовать этот подход в Java-ориентированных реализациях JAX-RS, таких как Jersey или Apache CXF?
Цель состоит в том, чтобы иметь несколько классов @Resource с тем же значением @Path, но для обслуживания запроса на основе фактической версии, указанной в типе MIME?
Я изучил JAX-RS в целом и Джерси в роли участника и не нашел поддержки для этого. Джерси не дает возможности зарегистрировать два ресурса по тому же пути. Замена класса WebApplicationImpl должна быть реализована для поддержки этого.
Вы можете что-то предложить?
ПРИМЕЧАНИЕ. Требуется одновременное доступность нескольких версий одного и того же ресурса. Новые версии могут вносить несовместимые изменения.