在我的弹簧控制器中,我有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种方法。
请在这里帮助我。
答案 0 :(得分:1)
这实际上取决于您的使用案例以及所有变化。你可以采用技术上许多不同的路径,但我会描述两个听起来像是适合你的路径。
为v1创建路径参数并添加条件,检查路径参数是否为v2并调用不同的方法。
为api / v2创建新路径,添加更改功能并调用v1端点方法。
这实际上是具体的,应该根据您应该采用的方式进行评估,具体取决于现有代码的实现方式。
答案 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-negotiation和http://blog.ploeh.dk/2015/06/22/rest-implies-content-negotiation/
答案 2 :(得分:1)
如果您想对两个版本使用单独的方法,可以在@RequestMapping
@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)
但是如果你想用同样的方法处理它,你可以使用
@RequestMapping(
value = "baseurl/{version}/role",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE)
public returnType methodName(@PathVariable("version") String version){
// code to check version
}
@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
在单独的控制器中管理它们
@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)。