2012-03-20 35 views
8

我正在寻找很好的工具来支持更改REST服务中使用的模型版本的支持。我的梦想工具会做这样的事情:可用适用于Java的REST模型版本控制的好工具

  • 我的POJO + 1.0版的config /变压器=>服务与我的模型的1.0
  • 我的POJO + 1.1版的config /变压器=>可提供的1.1服务我模型

在我的具体情况我并不需要做逆转变为我的REST服务将只提供数据的查找,永不储存的东西,但我不介意使用的工具都:-)

我正在考虑的解决方案是添加c在我的pojo(版本+名称)中创建ustom注释,并创建一个代码生成器,根据版本号根据我的pojo生成JSON/XML。尽管在这里我感觉我正在重新发明轮子。

编辑: 这里是一个变化的一个例子,可以从版本1进行到版本1.1:

版本1: 人 姓名 姓氏

版本1.1 人 姓名 姓氏 出生日期

如果您使用版本1.0访问API,则不会获得birthdate属性 - 它是仅在版本1.1中可用。我希望工具支持使这些服务可用,在那里我可以配置,授予我的pojo(目前像1.1版本),我想提供一个不显示这些值的1.0版本。

模型的其他合法更改可能是删除属性或重命名属性(或甚至重命名实体)。

编辑2: 数字Joel在评论中提到,有关版本化API的讨论,您应该阅读https://stackoverflow.com/posts/9789756/

版本控制的简单方法当然不是向后突破API更改,而是更改业务,所以这并非总是可行。我的兴趣在于如何使这些变化更容易处理,因此我的问题。

编辑3: 我在寻找可能有助于这个过程的工具,但仍然没有什么能够很好地将它与休息连接起来。下面是我迄今发现的链接:

回答

9

正如在一个答案中提到的那样,可能没有可用于自动版本化API的工具。

我们可以用两个步骤的方法来解决这一难题:

1)API 的版本控制信息上有最好的实践中,许多争论。 两个最流行的是:

(i) URI redesign - putting version info in URI like 
http://something.com/v1.0/resource1/ or 
http://something.com/resource1?ver=1.0 

(ii) Using HTTP Header - putting version info in Accept/Content-Type 
header keeping URI intact like 
# 
GET /something/ HTTP/1.1 
Accept: application/resource1-v1.0+json 

2)使用JSON/XML库

一旦版本信息与我们同在,我们必须相应地产生资源相同的POJO的多个版本。 有很多json和xml库,我们可以使用它们来维护同一个pojo的多个版本,并仅基于版本序列化仅需要的属性。谷歌gson java库在这方面很出色。检查 https://sites.google.com/site/gson/gson-user-guide#TOC-Versioning-Support

public class Person{ 

@Since(1.0) 
private String firstname; 

@Since(1.0) 
private String lastname; 

@Since(1.1) 
private String birthdate; 

} 
+0

优秀的回应。 gson库看起来很不错。 – Knubo 2012-03-27 23:39:43

+3

不错的一个!我不知道gson有版本控制支持。你应得的赏金。 – digitaljoel 2012-03-28 17:21:15

+0

当时间用完时,我肯定会掏出赏金,没有人会击败他的回答:-) – Knubo 2012-03-28 19:24:51

-1

你说的是那将版本的东西你在开发世界中(维护你的api版本给用户)还是在现场服务器世界(运行时内容协商)?

对于前者,请看像maven,常春藤,gradle等工具..这就是他们的目的。我个人使用maven是因为它是我认识的最好的一个,但它们都允许你为这个目的发布版本的jar文件。

+0

我正在讨论版本控制API。 – Knubo 2012-03-20 18:42:35

+0

如果您打算在jar文件中打包版本以便分发给用户来构建,请查看maven。 – 2012-03-20 19:36:44

+0

关于我的问题 - 它与maven无关 - 我正在寻找工具来版本化REST Web服务API,而不是如何版本化用于构建系统的组件。 – Knubo 2012-03-21 06:40:40

0

只是一个想法,但不会更好地让你的api向后兼容;那么你只需要为你的代码库进行版本控制,这样就不那么麻烦了?

1

我不知道任何自动版本化RESTful API的工具。有关版本控制REST的大讨论,您应该阅读Best practices for API versioning?

我花了很多时间相当寻找到这种策划一个RESTful API时,我们来到了,我们会在不引入重大更改的方式演变的结论。如果需要重大更改,我们会将其作为新资源公开,而不是尝试在自定义标头或MIME类型中使用版本信息。但是,对于你的问题,这意味着我的工作,这是更有动力防止突变。

当涉及到的工具,我严重怀疑你会找到的东西,可以自动地让支持你的REST的API,多个版本所需要的变化。这需要一个工具来理解模型的两个版本之间的差异,以及API中的所有交互。

如果您符合REST的HATEOAS原则,那么来自给定位置的所有目标都包含在响应中,在这种情况下,您可以使用类似REST的支持Spring MVC中的请求映射来保持版本号在所有的URLs中都有来自客户端的单一入口点,但您仍然需要维护每个版本的控制器和模型。

+0

感谢参考 - 我会将其添加到我的问题中,因为重要的是,人们在查找此问题时首先了解如何在解决问题之前对API进行版本化,以便在代码中执行此操作。 – Knubo 2012-03-23 07:10:04

1

这不是你可能期望,因为我不使用一个开源的外部工具做繁重的我的答案。我使用我自己的工具。

我使用泽西岛。我使用/ vx /包含在我的@Path声明中。

由于REST API代表合同,我不相信自动创建。然而,我在一个不是很复杂的maven插件中完成了一个XLST工具。)我保留简洁的xml版本并转换成gensrc中的Jersey类。

我发现,V1具有一定的路径和矩阵/查询参数唯一在设计的时候。当我开发v2时,我经常发现我需要支持其他参数或重新构建我的url以便更好地理解。我只需要更改xml文件。

我的世代引擎将创建我的泽西层与MyAPIv1.java和MyAPIv2.java并根据时间的需要进行注释。

所以我想保留版本控制,并有一个汽车/工具可能是有害的。

同样,使用规范是完全控制,但不能完全实现薄层的好方法。

所以这里没有雪茄,但这可能会有帮助。