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

发布于 2021-06-16 15:31:45

假设有下面一个场景: 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
}

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

查看更多

关注者
0
被浏览
1000
5 个回答
deplives
deplives 2021-06-16
这家伙很懒,什么也没写!

用路由去控制,domain/v1/xxxx domain/v2/xxxx 不要在业务代码里判断版本,这样后期维护成本太高了

kaneg
kaneg 2021-06-16
这家伙很懒,什么也没写!

URL 加版本 /v1/abc, /v2/abc 。既要支持多版本,又要代码完全不重复是不可能同时满足的,鱼与熊掌不可兼得。只能尽量通过抽取公共代码的方式来消除重复代码。毕竟对外的 API 就是这种特性,一旦暴露即等同于固化。除非根本就不管兼容性的问题

11anus77
11anus77 2021-06-16
这家伙很懒,什么也没写!

你这样无论如何都要有 2 套逻辑共存。注意我说的是逻辑,无论是客户端还是后端,所以你维护两块代码是不可避免的事

youngyezi
youngyezi 2021-06-16
这家伙很懒,什么也没写!

你这种情况,可以通过客户端上传版本号(版本号放 url,header 都可以)。项目代码里构造一个版本控制的中间件,通过中间件来转发:"把不同的版本转发到对应的版本下的 Action"。
1.这样不需要增加网关等其他额外服务
2.不需在每个方法体里做版本判断
3.多版本共存,哪个版本有变动只需要修改对应版本下的方法

samin
samin 2021-06-16
这家伙很懒,什么也没写!

业内做法:

  1. 两个项目,历史项目的接口用 /v1 标识区分,新项目用 /v2 标识区分,流量进入不同的项目互不影响
  2. 同一个项目中,和 1 是一样的,只不过用不同的包来存放接口,一样用类似的方法来区分

不管哪种方式,谨记代码方法编写的单一性原则

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览