服务端如何维护多版本的API接口

开发API接口的时候经常会遇到多个版本的客户端,如果不是特别严重的问题,又不能强制客户端升级,那么这个时候就会产生一个问题,不同版本的客户端需要不同版本的API接口与之对应


对此,我们常用的方式有哪些呢?

1.在代码中判断版本

1
2
3
4
5
if($v== "v1"){ 
//执行V1版本的逻辑
}elseif($v == "v2"){
//执行V2版本的逻辑
}

2.每个版本使用独立的代码

1
2
3
4
5
6
7
controllers
---- V1
-------- IndexController.php
---------TestController.php
----V2
--------- IndexController.php
--------- TestController.php

在这里,V2版本的代码是通过复制V1的代码而来的

3.后续版本继承前面的版本

1
2
3
4
5
6
7
controllers
---- V1
-------- IndexController.php
---------TestController.php
----V2
--------- IndexController.php
--------- TestController.php

V1的代码

1
2
3
4
5
6
7
8
//IndexController.php
namespace Controllers/V1;
class IndexController {

public function method1(){
//do something
}
}

V2的代码

1
2
3
4
5
6
7
8
9
namespace  Controllers/V2;
use Controllers/V1/IndexController;
class IndexController extends IndexController{

//v2 版本新增内容
public function medhtod2(){
//do something
}
}

4.使用路由控制

文件结构

1
2
3
4
5
6
7
8
controllers
----RootController.php
---- V1
-------- IndexController.php
---------TestController.php
----V2
--------- IndexController.php
--------- TestController.php

3.1 假设路由是这样的:https://www.xx.com/api/v1/controller/action

3.2 这里只需要配置一个路由就行,我们将所有的请求都路由到RootController的action方法中

1
2
//如请求:http:xx.com/api/v1/user/users
Route::any("api/{version}/{controller}/{action}","Controller/RootController@action")

3.3 在action方法中,我们要进行判断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
namespace Controllers;
use Request;
class RootController{

public function action(Request $request,$version,$controller,$action){

$vCode = substr($version,1,1);
$controller = $controller."Controller";

while(true){

$version = "V".$vCode;
$class = "Controllers\Api\".$version."\".$controller";
if(class_exists($class)){

$class = new $class();

if(method_exists($class,$action)){

return $class->$action();

}
}

if($vCode > 2){
$vCode--;
cotinue;
}
die("not fund");
}
}
}

总结

在第4中方法中,不同版本直接的代码及没有继承,也没有完全复制,并且代码也不显得冗余,是一种值得考虑的方式(本例代码使用的是laravel框架)