后端接口如何做版本控制?

2021-06-14 19:38:46 +08:00
 rockyliang

假设有下面一个场景: 1.0 版本客户端的用户注册功能,手机号是可选填的,即使用户不输入手机号也能注册,对应的后端接口 URL 是 v1/reg

但到了 1.1 版本,手机号改为了必填,这时候有两种做法:

1 )做一个新的 v2/reg 后端接口给客户端使用,缺点是,需要同时维护 v1 、v2 两个版本的接口,而且会造成两个接口的代码大量冗余,除了“手机号是否必填”不一样以外,其它功能的代码都一样

2 )让客户端把版本号传过来,后端接口根据客户端版本号来判断手机号是否必填,缺点是,接口里会充斥着很多对客户端版本号进行判断的代码,例如:

if (appVersion == "1.0") {
    // do something
} else if (appVersion == "1.1") {
    // do something
} else {
    // do something
}

上面哪种做法更好呢?或者各位大神有没有更好的版本控制方案?

7927 次点击
所在节点    程序员
49 条回复
walker2laok
2021-06-15 15:24:20 +08:00
沟通好只维护 3 个或其它个版本 [v2 、v3 、v3.1] ,如果 v1 来了,就提示强制升级
youngyezi
2021-06-15 15:28:44 +08:00
你这种情况,可以通过客户端上传版本号(版本号放 url,header 都可以)。项目代码里构造一个版本控制的中间件,通过中间件来转发:"把不同的版本转发到对应的版本下的 Action"。
1.这样不需要增加网关等其他额外服务
2.不需在每个方法体里做版本判断
3.多版本共存,哪个版本有变动只需要修改对应版本下的方法
uselessVisitor
2021-06-15 19:02:00 +08:00
网关根据版本来控制好一些
uselessVisitor
2021-06-15 22:10:50 +08:00
或者 header + filter 处理一下就行
samin
2021-06-16 10:42:07 +08:00
业内做法:
1. 两个项目,历史项目的接口用 /v1 标识区分,新项目用 /v2 标识区分,流量进入不同的项目互不影响
2. 同一个项目中,和 1 是一样的,只不过用不同的包来存放接口,一样用类似的方法来区分

不管哪种方式,谨记代码方法编写的`单一性`原则
dcoder
2021-06-16 12:51:49 +08:00
@rockyliang
其实方法(1),(2)最后都需要保存 2 套逻辑, 所以一定要做的事情是: factor out 共用逻辑,减少重复代码.
至于很多人说不能用(2), 其实也不一定, 因为很多小更新(v1.0.0 --> v1.0.1), 也不一定要新开个大版本号 (v1.0 -->v2.0)
dcoder
2021-06-16 12:53:34 +08:00
像这种小更新(v1.0.0 --> v1.0.1), 也不一定要重新定义一个 api/path/v1.0.1
edk24
2021-06-16 15:34:40 +08:00
后台接口大多是要配置路由的,类似这段伪代码。多写一个接口就可以了

```
web.get("/v2/user/register", function(req, resp){

});

web.get("v1/user/register", function(req, resp){

});
```
hewiefsociety
2021-06-16 18:35:17 +08:00
就是一楼那么做

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/783333

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX