开发API接口的时候经常会遇到多个版本的客户端,如果不是特别严重的问题,又不能强制客户端升级,那么这个时候就会产生一个问题,不同版本的客户端需要不同版本的API接口与之对应
对此,我们常用的方式有哪些呢?
1.在代码中判断版本
1 2 3 4 5
| if($v== "v1"){ }elseif($v == "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
| namespace Controllers/V1; class IndexController {
public function method1(){ } }
|
V2的代码
1 2 3 4 5 6 7 8 9
| namespace Controllers/V2; use Controllers/V1/IndexController; class IndexController extends IndexController{
public function medhtod2(){ } }
|
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
| 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框架)