问题
开发过程中我们经常碰到接口升级的需求,比如v1版本的app已经发布了用户正常使用。现在需要发布v2版本的app,因为业务需求有的接口返回值却改了。现在我们的后端服务既要兼容 v1 版本的app,又要兼容 v2 版本的app
比如 /get 这个接口
@GetMapping("get")
public Map get(){
return Map.of(
"a" , "a",
"b", "b"
);
}
返回值如下:
{
a:a,
b:b
}
但是我们有一天我们需要升级接口返回值有所修改,返回值如下
{
c:c,
d:d
}
那这个时候我们应该怎么办那?
1. 添加指定前缀
在 application.yaml 中添加
server:
servlet:
context-path: /api/v1
不过这种办法不太好,毕竟改了所有的api接口,需要部署多个服务配合nginx转发
2. 利用@RequestMapper 的 headers 参数
// 新添加一个方法
// 在http请求时候`headers`添加一个 api-version=v2 的参数,就会请求到当前方法
@GetMapping(value = "get", headers = {"api-version=v2"})
public Map get_v2(){
return Map.of(
"c","c",
"d", "d"
);
}
这种方法既影响之前的接口,也不用部署多个服务;只需要前端在请求时添加一个 headers 参数。