春天休息api版本

时间:2017-08-01 12:51:08

标签: spring rest web-services spring-mvc

在我的弹簧控制器中,我有2个休息api方法。例如:getUser,getRole 一个客户端正在通过“/ api / v1”访问它。 现在我想更新其中一个方法。即getRole。所以新的方法/版本将是“/ api / v2”。 但是v1的方法没有变化。即“/ api / v1”。

如何在同一个项目中使用这两个版本处理其余方法? 我的意思是,getUser rest API应该同时支持“/ api / v1”和“/ api / v2”。 getRole rest API应支持两个版本但功能不同(例如:数据库已更改,逻辑已更改)。 简单来说, 1. getUser将有1个方法支持这两个版本。 2. getRole将为每个版本提供2种方法。

请在这里帮助我。

4 个答案:

答案 0 :(得分:1)

这实际上取决于您的使用案例以及所有变化。你可以采用技术上许多不同的路径,但我会描述两个听起来像是适合你的路径。

  1. 为v1创建路径参数并添加条件,检查路径参数是否为v2并调用不同的方法。

  2. 为api / v2创建新路径,添加更改功能并调用v1端点方法。

  3. 这实际上是具体的,应该根据您应该采用的方式进行评估,具体取决于现有代码的实现方式。

答案 1 :(得分:1)

我会采用以下方法

在应用程序级别定义一个版本(从/ v1开始) - 只有当您想对整个API进行更大的更改并且通常是稳定的时,才会更改此版本。

资源(角色,用户)等应该通过标题

进行内容协商

e.g。

GET /v1/users/503deb67-ff6e-4d1c-a225-408b910b7252/ HTTP/1.1
Accept: application/vnd.yourorg.users-v1+json

此处客户端通过HTTP标头

对她感兴趣的特定资源使用内容协商

有关详细信息,请参阅https://www.mashery.com/blog/ultimate-solution-versioning-rest-apis-content-negotiationhttp://blog.ploeh.dk/2015/06/22/rest-implies-content-negotiation/

答案 2 :(得分:1)

如果您想对两个版本使用单独的方法,可以在@RequestMapping

中定义不同的值

方法1

    @RequestMapping(
                value = "baseurl/v1/role",
                method = RequestMethod.GET,
                produces = MediaType.APPLICATION_JSON_VALUE)

   and


    @RequestMapping(
                    value = "baseurl/v2/role",
                    method = RequestMethod.GET,
                    produces = MediaType.APPLICATION_JSON_VALUE)

但是如果你想用同样的方法处理它,你可以使用

方法2:使用@PathVariable

@RequestMapping(
            value = "baseurl/{version}/role",
            method = RequestMethod.GET,
            produces = MediaType.APPLICATION_JSON_VALUE)
public returnType methodName(@PathVariable("version") String version){

// code to check version

}

方法3:使用@RequestHeader

@RequestMapping(
                value = "baseurl/role",
                method = RequestMethod.GET,
                produces = MediaType.APPLICATION_JSON_VALUE)
    public returnType methodName(@RequestHeader("version") String version){

    // code to check version

    }

但正如你所说,你有不同版本的api更喜欢在课堂上使用@RequestMapping在单独的控制器中管理它们

方法4:

@RestController
@RequestMapping("/v1")
public class anyController {

}

and 

@RestController
@RequestMapping("/v2")
public class anyController {

}

答案 3 :(得分:0)

有很多方法,但很可能你想让代码保持尽可能分离。这使得将版本保持在单独的类中是一个不错的选择:

V1Controller.java:

@RestController
@RequestMapping("/api/v1")    
public class V1Controller{
    // version 1 api
}

V2Controller.java:

@RestController
@RequestMapping("/api/v2")    
public class V2Controller{
    // version 2 api
}

但是对于更高程度的解耦,您可以在同一个Tomcat或Jetty服务器上部署两个不同的Web应用程序 - 在上下文路径“/ api / v1”下的版本1和在上下文路径上的版本2“/ api / v2 ”。 webapps只是构建不同版本的相同代码(或不同分支的构建 - 如果你使用git)。