tp5 API版本控制方法

thinkphp5 RESTful api开发版本控制,thinkphp官方文档不是很详细,我根据个人经验分享下。

我们以一个用户信息读取的接口为例,包含两个版本V1和V2,v2版本的接口包括用户的档案信息,统一使用json格式数据输出到客户端。

在application目录下面创建api模块目录,并创建controller和model子目录,因为api接口无需视图,所以不需要创建view目录。

api版本号可以在请求头、参数、URL路由参数中传入,以下是tp5.X中使用方法。

最后项目的目录结构(优雅的目录结构,尤其喜欢tp5这个目录结构):

tp5 API版本控制方法

例子:TP5.1

1、修改路由:/route/route.php

tp5 API版本控制方法

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <[email protected]>
// +----------------------------------------------------------------------

Route::get('think', function () {
    return 'hello!';
});

Route::get('hello/:name', 'index/hello');

//return [
//
//];
return [
    // api版本路由
    'api/:version/:controller'=>'api/:version.:controller/index',// 省略方法名时 网址格式:http://www.xxx.com/api/v1/index
    'api/:version/:controller/:function'=>'api/:version.:controller/:function'// 有方法名时 网址格式:http://www.xxx.com/api/v1.index/login
];

2、控制器代码:\application\api\controller\v1\  index.php

tp5 API版本控制方法

<?php
namespace app\api\controller\v1;

class Index extends Common{
  
	  
    public function index(){
    	
      echo "111";
    }
  
 

}

3、Common.php 路径:\application\api\controller\v1\

<?php
namespace app\api\controller\v1;
use think\Controller;
use think\Validate;
use think\Request;
use think\db\Where;
use think\Db;
class Common extends Controller
{
	/**
     * 公共部分
     */
	public function __construct()
    {


    }

}

 

第一种:URL路由传入方式(推荐)

 在route.php路由文件中配置,如下

return [
    // api版本路由
    'api/:version/:controller'=>'api/:version.:controller/index',// 省略方法名时
    'api/:version/:controller/:function'=>'api/:version.:controller/:function'// 有方法名时
 
];

不同版本的URL访问地址为:

http://tp5.com/api/v1/user/10
http://tp5.com/api/v2/user/10


版本号中不能包含.符号。

第二种:请求头传入方式

 在route.php路由文件中配置,如下

$v = request()->header('version');
if($v==null) $v = "v1";
return [
 
    //api版本控制
    'api/:controller$'=>['api/'.$v.'.:controller/index',['method' => 'get']],
    'api/:controller/:function$'=>'api/'.$v.'.:controller/:function',
 
    //资源路由
    '__rest__'=>[
        //api
        'api/house'=>['api/'.$v.'.house',['only'=>['index','read','update','delete']]],
        'api/book'=>['api/'.$v.'.book',['only'=>['index','read','save','delete']]],
        'api/book_rent'=>['api/'.$v.'.book_rent',['only'=>['index','read','save']]],
  ]
]


第三种:请求参数传入方式

和请求头方式类似,这里不再累述。


控制器实现

v1版本控制器(类文件位置为application/api/controller/v1/User.php)代码如下:

namespace app\api\controller\v1;
 
use app\api\model\User as UserModel;
 
class User
{
    // 获取用户信息
    public function read($id = 0)
    {
        $user = UserModel::get($id);
        if ($user) {
            return json($user);
        } else {
            return json(['error' => '用户不存在'], 404);
        }
    }
 
}


v2版本的控制器(类文件位置为application/api/controller/v2/User.php)代码如下:

namespace app\api\controller\v2;
 
use app\api\model\User as UserModel;
 
class User
{
    // 获取用户信息
    public function read($id = 0)
    {
        $user = UserModel::get($id, 'profile');
        if ($user) {
            return json($user);
        } else {
            return json(['error' => '用户不存在'], 404);
        }
    }
 
}

 

REST请求的测试方式有很多,下面介绍两种常用的方式:

Postman

最方便的方法就是通过Postman来测试接口,给Chrome浏览器安装一个postman扩展,访问下面地址获取官方扩展:https://www.getpostman.com/

tp5 API版本控制方法

安全建议


尽量采用HTTPS协议进行接口请求;
重要的功能加密传输;
做好接口的身份认证;
对URL中的参数做好安全过滤;
对接口请求做好请求速率限制;
重要ID不透明处理;
使用JSON格式返回数据;

--------------------- 
作者:狂野小青年 
来源:**** 
原文:https://blog.****.net/veloi/article/details/73848781 
版权声明:本文为博主原创文章,转载请附上博文链接!