原文链接: http://wwwblogs/John727/p/4507956.html
环境配置:
开启服务器伪静态
本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码
[plain] view plain copy- LoadModule rewrite_module modules/mod_rewrite.so
将其前面的#去掉,如果没有找到则添加进去。
找到一下代码
[plain] view plain copy- <Directory "C:/phpStudy/Apache/cgi-bin">
- AllowOverride All
- Options None
- Require all granted
- </Directory>
将原本的AllowOverride None改为AllowOverride All。
然后在站点根目录下创建一个.htaccess文件,内容如下:
[plain] view plain copy- <IfModule mod_rewrite.c>
- Options +FollowSymlinks
- RewriteEngine On
- RewriteCond %{REQUEST_FILENAME} !-d
- RewriteCond %{REQUEST_FILENAME} !-f
- RewriteRule . index.php
- </IfModule>
此处不再赘述yii2的配置,如果需要可以看YII2实战手册。
YII2实际操作:
1、配置URL规则及modules
(1)新建modules文件夹,实行api接口版本控制。例如V1版本、V2版本……
在v1文件夹下新建controllers文件夹(控制器)、models文件夹(模型)、Module.php配置文件。
Module.php文件如下:
[php] view plain copy- <?php
- namespace api\modules\v1;
- class Module extends \yii\base\Module
- {
- public $controllerNamespace = 'api\modules\v1\controllers';
- public function init()
- {
- parent::init();
- }
- }
第2行和第7行随版本扩展而变化(v1->v2...)。
(2)配置config文件夹下的main.php文件
[php] view plain copy- <?php
- $params = array_merge(require (__DIR__ . '/../../common/config/params.php'), require (__DIR__ . '/../../common/config/params-local.php'), require (__DIR__ . '/params.php'), require (__DIR__ . '/params-local.php'));
- return [
- 'id' => 'app-api',
- 'basePath' => dirname(__DIR__),
- 'bootstrap' => [
- 'log'
- ],
- 'modules' => [
- 'v1' => [
- 'class' => 'api\modules\v1\Module'
- ],
- 'v2' => [
- 'class' => 'api\modules\v2\Module'
- ]
- ],
- 'controllerNamespace' => 'api\controllers',
- 'components' => [
- 'user' => [
- 'identityClass' => 'common\models\User',
- 'enableAutoLogin' => false,
- 'enableSession' => false,
- 'loginUrl' => null
- ],
- 'urlManager' => [
- 'enablePrettyUrl' => true, // 启用美化URL
- 'enableStrictParsing' => true, // 是否执行严格的url解析
- 'showScriptName' => false, // 在URL路径中是否显示脚本入口文件
- 'rules' => [
- [
- 'class' => 'yii\rest\UrlRule',
- 'controller' => [
- 'v1/site'
- ]
- ],
- [
- 'class' => 'yii\rest\UrlRule',
- 'controller' => [
- 'v2/site'
- ]
- ]
- ]
- ],
- 'log' => [
- 'traceLevel' => YII_DEBUG ? 3 : 0,
- 'targets' => [
- [
- 'class' => 'yii\log\FileTarget',
- 'levels' => [
- 'error',
- 'warning'
- ]
- ]
- ]
- ],
- 'errorHandler' => [
- 'errorAction' => 'site/error'
- ]
- ],
- 'params' => $params
- ];
- main.php
注意10~17行、20~44行的组件配置,相信大家仔细阅读就能明白,此处不再赘述原理,请大家尤其注意33~35行的代码,此处表示的是v1/site控制器,随着接口控制器的增多,可以直接在数组中增加即可。本文力求快速配置出RESTful架构的实现。
(3)v2、v3表示以后的版本变化,配置都类似于v1文件夹。
2、创建一个模型
数据库准备一个名为mxq_guide的数据表
[sql] view plain copy- CREATE TABLE `mxq_guide` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `imgurl` varchar(255) DEFAULT NULL COMMENT '图片路径',
- `status` int(11) DEFAULTNULL COMMENT '1启用 0禁用',
- `flag` int(11) DEFAULTNULL COMMENT '1安卓 2苹果',
- PRIMARY KEY (`id`)
- ) ENGINE=MyISAM AUTO_INCREMENT=24 DEFAULT CHARSET=utf8 COMMENT='APP导航图';
创建后请注意及时往数据库添加几条数据信息。
通过脚手架gii来创建guide.php模型(使用方法请看yii2权威指南)。生成后的文件注意改写,修改为如下形式以满足RESTful的需求。之后从models文件夹中转移到v1/models文件夹中,并注意命名空间的修改。
[php] view plain copy- <?php
- namespace api\modules\v1\models;
- use Yii;
- use yii\db\ActiveRecord;
- use yii\web\IdentityInterface;
- /**
- * This is the model class for table "{{%guide}}".
- *
- * @property integer $id
- * @property string $imgurl
- * @property integer $status
- * @property integer $flag
- */
- class Guide extends ActiveRecord implements IdentityInterface
- {
- public static function findIdentityByAccessToken($token, $type = null)
- {
- return static::findOne([
- 'access_token' => $token
- ]);
- }
- public function getId()
- {
- return $this->id;
- }
- public function getAuthKey()
- {
- return $this->authKey;
- }
- public function validateAuthKey($authKey)
- {
- return $this->authKey === $authKey;
- }
- public static function findIdentity($id)
- {
- return static::findOne($id);
- }
- public static function tableName()
- {
- return '{{%guide}}';
- }
- public function rules()
- {
- return [
- [
- [
- 'imgurl',
- 'status',
- 'flag'
- ],
- 'required'
- ],
- [
- [
- 'status',
- 'flag'
- ],
- 'integer'
- ],
- [
- [
- 'imgurl'
- ],
- 'string',
- 'max' => 255
- ]
- ];
- }
- public function attributeLabels()
- {
- return [
- 'id' => Yii::t('app', 'ID'),
- 'imgurl' => Yii::t('app', 'imgurl'),
- 'status' => Yii::t('app', 'status'),
- 'flag' => Yii::t('app', 'flag')
- ];
- }
- }
- guide.php
3、创建一个控制器
[php] view plain copy- <?php
- namespace api\modules\v1\controllers;
- use Yii;
- use yii\rest\ActiveController;
- use yii\filters\auth\CompositeAuth;
- use yii\filters\auth\QueryParamAuth;
- use yii\data\ActiveDataProvider;
- class SiteController extends ActiveController
- {
- public $modelClass = 'api\modules\v1\models\guide';
- public $serializer = [
- 'class' => 'yii\rest\Serializer',
- 'collectionEnvelope' => 'items'
- ];
- // public function behaviors()
- // {
- // $behaviors = parent::behaviors();
- // $behaviors['authenticator'] = [
- // 'class' => CompositeAuth::className(),
- // 'authMethods' => [
- // QueryParamAuth::className()
- // ]
- // ];
- // return $behaviors;
- // }
- public function actions()
- {
- $actions = parent::actions();
- // 注销系统自带的实现方法
- unset($actions['index'], $actions['update'], $actions['create'], $actions['delete'], $actions['view']);
- return $actions;
- }
- public function actionIndex()
- {
- $modelClass = $this->modelClass;
- $query = $modelClass::find();
- return new ActiveDataProvider([
- 'query' => $query
- ]);
- }
- public function actionCreate()
- {
- $model = new $this->modelClass();
- // $model->load(Yii::$app->getRequest()
- // ->getBodyParams(), '');
- $model->attributes = Yii::$app->request->post();
- if (! $model->save()) {
- return array_values($model->getFirstErrors())[0];
- }
- return $model;
- }
- public function actionUpdate($id)
- {
- $model = $this->findModel($id);
- $model->attributes = Yii::$app->request->post();
- if (! $model->save()) {
- return array_values($model->getFirstErrors())[0];
- }
- return $model;
- }
- public function actionDelete($id)
- {
- return $this->findModel($id)->delete();
- }
- public function actionView($id)
- {
- return $this->findModel($id);
- }
- protected function findModel($id)
- {
- $modelClass = $this->modelClass;
- if (($model = $modelClass::findOne($id)) !== null) {
- return $model;
- } else {
- throw new NotFoundHttpException('The requested page does not exist.');
- }
- }
- public function checkAccess($action, $model = null, $params = [])
- {
- // 检查用户能否访问 $action 和 $model
- // 访问被拒绝应抛出ForbiddenHttpException
- // var_dump($params);exit;
- }
- }
- SiteController.php
控制器请创建在modules/controllers文件夹下,并注意命名空间的修改。
要注意的是,此处的控制器与普通的控制器继承Controller不同,此处需继承ActiveController类。
20~30行注释的代码是基于RESTful架构的access_token认证,目前还未测试通过,后续补充。
至此,基于YII2的所有配置已基本完成,接下来介绍api接口测试工具及方法。
RESTful的测试工具PostMAN:
首先介绍一下postman这款插件,是基于谷歌浏览器的一款模拟请求的实用插件。具体使用,在下面测试过程中涉及截图,介绍不足之处请见谅,自己也是第一次使用。
推荐使用上面的APP版本,便于后续封装自己写好的api接口,下面的是网页版本。
YII2支持的RESTful有四种请求方式:GET查看信息,POST创建信息,PUT更新信息,DELETE删除信息。
下面开始演示四种请求数据的方式。(只是截图演示效果,具体使用还需要大家自己去摸索。)
此处演示的是GET方法请求数据库的数据。对应的是modules/controllers/SiteController/actionIndex方法。
请大家注意最上面方框内的URL地址,rest默认将控制器进行复数请求http://api.mxq/v1/sites,此处就是rest的默认规则。
打*星号位置显示的是正常的效果,如若出现错误,大家可以去YII权威指南——错误检查错误原因。
YII2的ActiveController默认实现了数据的分页效果。
此处演示的是POST方法新建数据库的数据。对应的是modules/controllers/SiteController/actionCreate方法。
如果在数据库的数据层写好数据校验规则,此处提交数据不满足要求的时候就会显示相应的错误。这也是REST的优势之一。比如如下情况,flag我定义的是int型:
接下来演示的是PUT方法更新数据库的数据。对应的是modules/controllers/SiteController/actionUpdate方法。
此处请大家再次注意最上面的URL:http://api.mxq/v1/sites/15 此处15代表的是数据库id为15的数据,表示更新数据库ID为15的数据信息。请大家一定注意。RESTful在使用更新和删除数据操作的时候,id不能一表单的形式提交,必须紧跟在URL之后。
接下来演示的是DELETE方法删除数据库的数据。对应的是modules/controllers/SiteController/actionDelete方法。
当返回值为1的时候表示的就是删除操作执行成功。具体原理请大家仔细观察sitecontroller控制器内的函数。
以上就是基于yii2的RESTful的一些简单介绍、实现方法以及测试结果。有什么不正确或遗漏的地方,欢迎大家来补充。后续也会在此基础上进行更新。本人第一次接触yii2框架和RESTful架构,表述如有不对之处,请大家见谅。
更多推荐
Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试
发布评论