基于Java的REST Web服务版本控制?

3
似乎有一场关于如何为REST web服务进行版本控制的哲学辩论正在进行中。然而,对我来说,最重要的问题是与Java servlet后端实现和维护相关的实际问题。我们公司正在构建一个新的REST web服务,虽然目前我们并不关心它的版本控制,但我不想做出一项会使我们陷入困境的架构决策。
我认为,我们现在必须做出的主要决定是:我们应该将版本标识符放在URI还是媒体类型中(或者两者都有)。如果相关的话,我们将只发布几种新的媒体类型。此外,应用程序具有50多个资源URI。
相对于在我们的Java servlet中实现它们,每种方法的利弊是什么?
我的初步想法是:
1)我喜欢将媒体类型版本化(例如“application/vnd.mystuff+xml;version=1.0”),因为它感觉上与为SOAP/RPC web服务版本化XML模式相同。此外,看起来conneg就是为这种事情而设计的。然而,如果我们的应用程序是使用面向域的设计原则创建的,则实现这一点似乎非常困难,甚至是不可能的,因为我们不能创建新版本的Java类,并让它们与旧版本的类并排存在。因此,我们必须实现新的Java类,然后手工编写JSON/XML序列化/反序列化以支持所有旧版本的媒体类型。我想这与为SOAP版本化XML模式没有什么不同...
2)另一方面,如果我们将URI版本化(例如“http://ourapp.com/v1/mystuff”),则我们的客户端可以部署两个完整版本的系统,并将它们作为有不同上下文映射的两个单独的servlet启动。但是,我们必须修改v1 Java类的JPA(ORM)映射以使用v2 RDBMS模式。这可能并不总是简单的,但我可以很容易地理解如何做到这一点。这种方法让我感到困扰,因为“application/vnd.mystuff+xml”将返回对应于两个不同XML模式的两个不同XML模型。但也许这并不重要,因为客户端知道它请求了什么,因为它使用了v1或v2 URI...
还是有一个更容易实现的替代方案我们没有考虑吗?或者推迟解决这个问题,以后再担心它是否可以呢?

在我看来,使用不同的URI更加清晰,让客户端更清楚地了解他正在使用什么。这对于版本控制整个API而不是单个资源来说更为合适(在同一“代”中在两个资源前面添加vX和vY会令人困惑)。这也是我见过大公司(如Yahoo、DropBox)最常用的方法。 - Viruzzo
2
https://dev59.com/l3RC5IYBdhLWcg3wK9yV - Michael
1个回答

1

如果移动应用程序使用restful服务,则同时处理响应会有些困难。在我看来,将版本保留在URL中是更好的方式,因为这样可以更容易地在方便时停用旧的端点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接