【问题标题】:Implementing URL Versioning without using any 3rd party plugin like UrlRewrite在不使用任何 3rd 方插件(如 UrlRewrite)的情况下实现 URL 版本控制
【发布时间】:2015-05-22 06:56:05
【问题描述】:

我有一个要求,我必须实现 URL 版本控制。所以我的 REST URL 应该同时使用 url 中的版本和没有 url 中的版本。如果 URL 中未提及版本,则 API 将被重定向到最新版本。

例如。

http://localhost:9090/v1/myservice/listAll 应该调用我的 API 的版本 1,如果我使用 url http://localhost:9090/myservice/listAll,那么它应该指向最新版本的 API。假设我在 URL 中没有提到 V1,那么它也应该指向 @ 987654323@。所以它是一种 Version 和 VersionLess URL。

我正在使用 Jersey 来实现我的 REST API,并且已经使用 UrlRewrite 完成了版本控制,但根据要求我不能使用任何 3rd 方 API。

那么,Jersey 是如何实现这样的功能的呢?

我可以使用@Path 注释来执行此操作并为同一资源定义多个 URL 吗?

注意:我知道 URL 版本控制不是实现的好方法 版本控制我应该使用自定义标头进行版本控制。 但是在这里我对客户有严格的要求来实施版本控制 仅在 URL 中使用!

【问题讨论】:

    标签: java rest jersey versioning


    【解决方案1】:

    试试

    @Path("/myService")
    public class MyLatestService {
    
        @GET
        @Path("listAll")
        public Response getMyService(...) { /* call the latest version */ }
    
    }
    
    @Path("/v1/myService")
    public class MyV1Service {
    
        @GET
        @Path("listAll")
        public Response getMyService(...) { ... }
    
    }
    
    @Path("/v2/myService")
    public class MyV2Service {
    
        @GET
        @Path("listAll")
        public Response getMyService(...) { ... }
    
    }
    

    等等..

    【讨论】:

    • 感谢您的回复,但我想使用这种方式可以在每种方法中产生大量重复。此外,如果版本继续增加,那么它也会继续增加我的类的大小。虽然版本控制本身就是管理每个版本的代码的混乱。
    【解决方案2】:

    你可以像这样使用可选的路径参数:

    /* Handle v1 explicitly and implicitly */
    @Path("/{version: v1/}?myService")
    public class MyServiceV1 {
      @GET
      @Path("listAll")
      public Response listAll(){}
    }
    
    /* Handle v2 explicitly */
    @Path("/v2/myService")
    public class MyServiceV1 {
      @GET
      @Path("listAll")
      public Response listAll(){}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-05
      • 2011-06-30
      • 2010-09-07
      • 2014-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多