使用 Guice 3.0 + JaxRS 2.0 对 REST API 进行版本控制

Posted

技术标签:

【中文标题】使用 Guice 3.0 + JaxRS 2.0 对 REST API 进行版本控制【英文标题】:Versioning REST API using Guice 3.0 + JaxRS 2.0 【发布时间】:2014-02-07 19:44:47 【问题描述】:

我想要一个使用 HTTP 请求标头的版本化 REST api:

GET /someResource

版本:1.0

现在,如果我有此资源的 2 个版本,我的 JaxRS Web 应用程序需要能够提供适合任一请求版本的响应。因此,我希望以下类成为我的类路径的一部分:

@Path("/someResource")
public class SomeResourceV1 
  **snip**

@Path("/someResource")
public class SomeResourceV2 
  **snip**

现在我想根据 Version 标头将请求分派到这些资源类之一。我假设这将使用 servlet 过滤器来完成。但由于我使用的是 Guice,我认为我正在寻找的是一个按请求注入器。

如果请求的版本为 1.0,则使用带有 SomeResourceV1 绑定的注入器 否则,如果请求的版本为 2.0,则使用带有 SomeResourceV2 绑定的注入器

我认为有一种方法可以通过继承 GuiceFilter 来获得我想要的东西,但我并不完全确定。有没有人尝试过这样的事情?

【问题讨论】:

您介意分享一下您是如何解决这个问题的吗? @RahulDabas 我已经有一段时间没有解决这个问题了。如果没记错的话,我相信我们使用了类似于 Xavier 建议的东西,尽管我们利用 profile 参数来确定要使用的资源的版本。如果我今天再做一次,我可能会部署 2 个独立版本的应用程序并使用 api 网关来选择如何将用户请求路由到正确的支持服务。祝你好运! 【参考方案1】:

不完全是您要求的,但您可以在请求媒体类型中包含版本(例如:application/vnd.foo.v1+json - vnd 指定自定义供应商类型,+json 允许 JAX-RS 实现知道传入的请求实体是 JSON 格式)。 然后,您可以在每个方法上使用 @Consumes 注释进行调度(例如:@Consumes("application/vnd.foo.v1+json")@Consumes("application/vnd.foo.v2+json"),而无需添加自定义过滤器。

【讨论】:

感谢 Xavier,我考虑过媒体类型,但我倾向于同意 Joe:***.com/a/11923744/1028367 此外,我不太喜欢在同一类中混合 2 个版本的代码的想法。我可能会不小心更改 V1 代码路径上的某些内容,无意中破坏了 V1 消费者。如果请求 V2,我真正想要的是不绑定 V1 或将其作为 jaxrs 资源公开。

以上是关于使用 Guice 3.0 + JaxRS 2.0 对 REST API 进行版本控制的主要内容,如果未能解决你的问题,请参考以下文章

jersey 2.0 jaxrs RI - 在异常时返回 json 字符串

使用 C# 3.0 编译的 C# 2.0 代码使用程序集

如何将 PowerShell 版本从 2.0 升级到 3.0

selenium 3.0与2.0 打开火狐浏览器的区别

HTTP 1.0、1.1、2.0、3.0区别

Web 1.0,2.0,3.0 分别是啥意思