Dawn-Api
[Toc]
项目地址
https://github.com/liushoukun/dawn-api
DEMO
https://github.com/liushoukun/dawn-api-demo
thinkphp5编写的restful风格的API,集API请求处理,权限认证,自动生成文档等功能;
restful风格处理请求
每个接口对于一个控制器,method对应[method]方法响应
权限认证
Basic,Oauth Client Credentials Grant
文档生成
简洁,优雅,不需要额外的文档工具;
如果想在你的TP5项目中使用,那么可以直接使用
composer require liushoukun/dawn-api
如果是新项目先要创建tp5项目,然后再require
composer create-project topthink/think api --prefer-dist
composer require liushoukun/dawn-api
如果要使用生成文档 需要在public/static/ 下 安装hadmin
cd /public/static/
git clone https://git.oschina.net/liushoukun/hadmin.git
新建demo 模块
创建业务基础类 Base 继承 Api
创建一个用户接口 User 继承 Base
添加路由 action需要填写restful(会进行调用)
/v1/user
'[v1]'=>['user'=>['demo/User/restful',],//用户模块接口],
设置允许访问的方式
//允许访问的请求类型public$restMethodList='get|post|delete';
获取用户(get),post(新增用户)的相应方法
/*** get**@paramRequest $request*@return\think\Response|\think\response\Json|\think\response\Jsonp|\think\response\Redirect|\think\response\Xml*/publicfunctionget(Request$request){//todo findreturn$this->sendSuccess(['name'=>'dawn-api','id'=>1]);}/*** post**@paramRequest $request*@return\think\Response|\think\response\Json|\think\response\Jsonp|\think\response\Xml*/publicfunctionpost(Request$request){//todo createreturn$this->sendError(400,'用户名不能为空');}
请求接口
GET的请求(获取用户信息)

POST的请求(添加用户)

PUT 让未允许的响应

DELETE 可以方法问题,但没有编写方法执行 _empty方法,如有需要可改写

1.添加配置 认证总开关
'api_auth' => true, //是否开启授权认证
2.权限类 实现AuthContract 接口
authenticate 接口认证返回true则通过,否则不通过
getUser 获取用户信息,Api控制可以调用
self::$app['auth']->getUser();
/*** 认证授权通过客户端信息和路由等* 如果通过返回true*@paramRequest $request*@returnbool*/publicfunctionauthenticate(Request$request){//TODO: Implement authenticate() method.returntrue;}/*** 获取用户信息 接口里可以直接获取用户信息*@returnmixed*/publicfunctiongetUser(){return['app_id'=>'111','name'=>'dawn-api'];}
接口类开启授权认证
//是否开启授权认证public$apiAuth=true;
配置(api_auth)类($apiAuth)效用
truetrue认证开启
truefalse认证关闭
falsefalse认证关闭
falsetrue认证关闭
配置验证类
'auth_class'=>\app\demo\auth\Auth::class,//授权认证类
改写get方法
/*** get**@paramRequest $request*@return\think\Response|\think\response\Json|\think\response\Jsonp|\think\response\Redirect|\think\response\Xml*/publicfunctionget(Request$request){$user=self::$app['auth']->getUser();//todo findreturn$this->sendSuccess(['name'=>'dawn-api','id'=>1,'user'=>$user]);}
可以获取到用户信息

当然简单实现了Basic,Oauth Client Credentials Grant认证
Oauth Client Credentials Grant
配置验证类
'auth_class'=>\app\demo\auth\Auth::class,//授权认证类
获取access_token
编写可访问的方法获取access_token
namespaceapp\demo\controller;useapp\demo\auth\OauthAuth;usethink\Request;classAuth{publicfunctionaccessToken(){$request=Request::instance();$OauthAuth=newOauthAuth();return$OauthAuth->accessToken($request);}}
配置路由
'accessToken'=>'demo/Auth/accessToken',//Oauth认证
按需改写获取客户端信息
/*** 返回用户信息*@returnarray*/publicstaticfunctiongetUserInfo(){return['client_id'=>'20882088',//app_id'secret'=>'nGk5R2wrnZqQ02bed29rjzax1QWRIu1O','name'=>'test_client'];}
请求获取 /accessToken?client_id=20882088&secret=nGk5R2wrnZqQ02bed29rjzax1QWRIu1O 或者 /accessToken headers Basic MjA4ODIwODg6bkdrNVIyd3JuWnFRMDJiZWQyOXJqemF4MVFXUkl1MU8=

3.请求接口 /v1/user?access_token=cxXpnNIdf4aSIQFjR8NYH91Uwsg8jzMZ




创建Doc文档显示控制器 wiki 继承 DawnApi\facade\Doc;
配置路由
'wiki'=>'demo/Wiki/index',//文档
3.配置文档显示目录
/*** 获取文档*@returnmixed*/publicstaticfunctiongetApiDocList(){//todo 可以写配置文件或数据$apiList=Config::get('api_doc');return$apiList;}
可以改写次方法以存储以无限级的方式,为了方便采用的是配置方式
tp5 增加额外配置 创建application/extra/api_doc.php 文件
return['1'=>['name'=>'测试文档','id'=>'1','parent'=>'0','class'=>'','readme'=>''],//下面有子列表为一级目录'2'=>['name'=>'获取权限','id'=>'2','parent'=>'1','class'=>'','readme'=>'/doc/md/auth.md'],//没有接口的文档,加载markdown文档'3'=>['name'=>'用户接口','id'=>'3','parent'=>'1','readme'=>'','class'=>\app\demo\controller\User::class],//User接口文档];

参数必须备注作用
nametrue接口列表名称显示列表名称
idtrue主键生成列表所用
parenttrue生成列表所用
classtrue接口位置用于生成具体接口文档
readmetruemarkdown可以生成没有接口的文档,比如一些说明 module和controller为空,readme填文档路径
3.具体接口文档配置
接口描述部分(类文件的注释)
/*** Class User* @title 用户接口* @url /v1/user* @desc 有关于用户的接口*@version1.0* @readme /doc/md/user.md*/classUserextendsBase{}
参数必须备注作用
titletrue接口标题显示列表名称
urltrue请求地址用户显示
desctrue接口描述显示描述
versionfalse版本号版本号
readmefalsemarkdown文档可以编写信息文档

具体接口文档
接口描述信息(注释填写)
/*** @title 获取用户信息* @desc 获取用户信息* @readme /doc/md/method.md*/publicfunctiongetResponse(\think\Request$request){}
参数必须备注作用
titletrue接口标题显示列表名称
desctrue接口描述显示描述
readmefalsemarkdown文档可以编写信息文档
2.请求参数
/*** 参数规则* @name 字段名称* @type 类型* @require 是否必须* @default 默认值* @desc 说明* @range 范围*@returnarray*/publicstaticfunctiongetRules(){$rules=[//共用参数'all'=>['time'=>['name'=>'time','type'=>'int','require'=>'true','default'=>'','desc'=>'时间戳','range'=>'',]],'get'=>['id'=>['name'=>'id','type'=>'int','require'=>'true','default'=>'','desc'=>'用户id','range'=>'',]],'post'=>['username'=>['name'=>'username','type'=>'string','require'=>'true','default'=>'','desc'=>'用户名','range'=>'',],'age'=>['name'=>'age','type'=>'int','require'=>'true','default'=>'18','desc'=>'年龄','range'=>'0-200',],]];//合并父级类参数returnarray_merge(parent::getRules(),$rules);}

返回参数(注释填写)
*@returnintidID*@returnstringusername错误信息*@returnintage年龄
参数必须备注
第一个参数true类型
第二个参数true参数名
第三个参数true参数说明
类型填写规则
'string'=>'字符串','int'=>'整型','float'=>'浮点型','boolean'=>'布尔型','date'=>'日期','array'=>'数组','fixed'=>'固定值','enum'=>'枚举类型','object'=>'对象',




IDE PHPSTORM
模拟请求 Postman
网友评论