【发布时间】:2011-06-22 21:09:41
【问题描述】:
REST 资源版本控制的最佳实践是将版本信息放入 HTTP 请求的 Accept/Content-Type 标头中,保持 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 进行了全面调查,特别是对 Jersey 进行了调查,但没有发现对此的支持。 Jersey 没有机会注册具有相同路径的两个资源。需要实现对 WebApplicationImpl 类的替换以支持它。
你能提出一些建议吗?
注意:同一资源的多个版本需要同时可用。新版本可能会引入不兼容的更改。
【问题讨论】:
-
这绝对不是 API 版本控制的最佳实践。最佳做法是没有版本,只进行兼容的更改。在我的书中,为每个明智的客户端应该自动处理的更改(向数据添加新标签/键)人为地创建新的 MIME 类型根本不是 RESTful。
-
嗯,并不总是可以进行兼容的更改。此外,在我的情况下,需要同时支持多个 REST 资源版本。就必须保留资源标识而言,URI 必须更改相同。新版本是资源的新表示,即新的 MIME 类型。
-
@Jochen 理想情况下,您永远不必进行版本控制。这应该是目标。但是,如果确实有必要,那么我会说这是处理它的最佳方法。
-
Darrel:这正是 IETF 规范以及许多公共 Web 服务使用 URL 的方式。这是一个明显而简单的版本控制解决方案。那里没有任何邪恶。它可能不适用于此用例,但可供其他所有人使用。
-
@StaxMan 在 MIME 类型中执行版本的好处是,您可以将 URL 传递给在 API 的较新版本上的不同客户端,它仍然可以工作。 (这只是一个明显有好处的例子)
标签: java rest versioning jersey jax-rs