app接口设计之不同版本统一管理
前言:APP接口的开发不同于PC的开发,因为不同版本的APP之间,接口可以同时使用,老版本的APP在新版APP出来之后依然可以用,所以为了便于维护和管理,就有必要设计好APP接口的管理策略
APP更新接口在更新时需要传递的参数:版本号、更新内容(文字说明)、更新地址、是否强制更新
1、APP版本号1.2.3:APP版本分为大版本和小版本
APP接口设计及更新策略(推荐):
(1)大版本更新(之前接口需要大量修改时叫做大版本更新,之前接口实在用不了了才会进行大版本更新):大版本更新时,需要把接口所在文档重新创建(相当于重新创建一个新的APP应用),使得其不同大版本之间接口相互独立,更易维护
(2)小版本更新(对接口的小范围修改及新增叫做小版本更新):小版本更新时,需要在每个修改的接口中进行版本号判断,从而进行不同的分发
1、按照大版本不同进行接口设计(不同版本之间接口独立),统一入口,URL后跟上版本号,不同的版本不同的分发去处:
例如:
接口URL:
大版本1接口:api.xxx.com/controller_1/index.php?version=1.0.1
大版本2接口:api.xxx.com/controller_2/index.php?version=2.0.2
文件夹位置:Controller/V1.0/
文件夹位置:Controller/V2.0/
2、按照小版本的不同进行接口设计,每个接口里加上if判断:
例如:
接口URL:api.xxx.com/index.php?version=1.0.1
if (version == ‘1.0.1’) {
do_something
} else if (version ==‘1.0.2') {
do_something
}
以下是网上对于APP API需要同时维护多个版本如何设计的回答:
第一种(不同版本不同文件夹):
Controller/V1.0.0/
Controller/V2.1.0/
第二种(不同版本不同方法):
Controller/
UserCreateController.php 内容如下
<?php
class UserCreate extends ApiController{
public function v1_0_0(){
}
public function v2_0_0(){
}
}
?>
第三种(同一接口中进行逻辑判断,版本参数在URL中):
客户端在做请求的时候在接口中添加ver字段,标识出请求的是哪个接口:
● api.xxx.com/api?ver=v1&...
● api.xxx.com/api?ver=v2&...
这种做起来比较简单也容易理解,但是在你的每个接口逻辑里面都得需要写判断版本的代码了。比如
if ver == 'v1':
do_something_with_v1_style
elif ver == 'v2':
do_something_with_v2_style
第四种(同一接口中进行逻辑判断,版本参数在header头中):
客户端在做请求的时候在HTTP HEAD里面中添加API-VERSION字段,标识出请求的是哪个接口:
● -H "API-VERSION: v1"
● -H "API-VERSION: v2"
这个需要统一做的事情稍微有点多,但之后的接口逻辑会比较好些。在入口的地方获取接口版本,然后把请求分发到对应版本的接口处理器上。
api(req):
if req.HEADS["API-VERSION"] == 'v1':
distribute_to_v1_api(req)
elif ver == 'v2':
distribute_to_v2_api(req)
第五种(不同版本不同域名):
不同版本使用不同的域名,这样:
● v1.api.xxx.com
● v2.api.xxx.com
域名的方式可以采用下面的两种方式:
1、不同版本的api部署成不同的应用(甚至可以部署到不同的服务器上),彼此间独立,其好处是部署的过程不会影响其他版本api的使用,并且可以减轻单台服务器的负担。
2、部署在一个应用上面,但是和第四种一样,在接口入口出分发到不同版本的接口处理器上进行处理。好处是不同版本间能够直接复用相同的功能
第六种(不同版本用继承的方式复用):
采用继承的方式,既可以利用之前的接口代码,又可以采用override的方式修改部分接口的实现。
这样是可以的。但是如果你上个版本(也就是父类)修改了代码,就会影响后面的所有版本。
在线上有bug或者需求变更的时候 很可能会修改基类。