【发布时间】:2013-01-27 10:40:40
【问题描述】:
我首先在 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 {...}
更新:
Jarrod 提出了一个 API 版本控制建议来处理标头中的版本。这也是一种方法,但是我期待在我们遵循基于 URI 的版本控制时使用最佳实践
【问题讨论】:
-
最佳实践是不将api版本信息放在URL中
-
这是一个很好的问题,我对没有回复感到非常惊讶。有数百人反对和支持 URI 版本控制,但所有主要网站都这样做,因为它明确且易于客户使用。 @Deepesh M - 你最后用了什么解决方案?
-
仅仅因为很多人做错了事情并不意味着它是一个好主意!这只是意味着很多人做错了。
-
我认为在 URL 上有版本违反了 REST 概念,因为从 REST 角度来看,“v1/users”意味着您正在尝试获取“v1 用户”。一个好的解决方案可能是将它放在请求标头中。
-
这是一个宗教问题,在您的情况下,“最佳实践”可能是“与您的 API 用户合作最适合您的方法”。这个问题stackoverflow.com/questions/389169/… 概述了一些很好的策略。