🤩 API 多版本竟然这么搞! 怪不得你提桶跑路💩

99 阅读1分钟

问题

开发过程中我们经常碰到接口升级的需求,比如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"  
);  
}

image.png 这种方法既影响之前的接口,也不用部署多个服务;只需要前端在请求时添加一个 headers 参数。