Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试

环境配置:

开启服务器伪静态

本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码

LoadModule rewrite_module modules/mod_rewrite.so

将其前面的#去掉,如果没有找到则添加进去。

找到一下代码

<Directory "C:/phpStudy/Apache/cgi-bin">
    AllowOverride All
    Options None
    Require all granted
</Directory>

将原本的AllowOverride None改为AllowOverride All。

然后在站点根目录下创建一个.htaccess文件,内容如下:

<IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule . index.php
</IfModule>

.htaccess

此处不再赘述yii2的配置,如果需要可以看YII2实战手册

YII2实际操作:

1、配置URL规则及modules

(1)新建modules文件夹,实行api接口版本控制。例如V1版本、V2版本……

在v1文件夹下新建controllers文件夹(控制器)、models文件夹(模型)、Module.php配置文件。

Module.php文件如下:

 1 <?php
 2 namespace api\modules\v1;
 3
 4 class Module extends \yii\base\Module
 5 {
 6
 7     public $controllerNamespace = ‘api\modules\v1\controllers‘;
 8
 9     public function init()
10     {
11         parent::init();
12     }
13 }

第2行和第7行随版本扩展而变化(v1->v2...)。

(2)配置config文件夹下的main.php文件

 1 <?php
 2 $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‘));
 3
 4 return [
 5     ‘id‘ => ‘app-api‘,
 6     ‘basePath‘ => dirname(__DIR__),
 7     ‘bootstrap‘ => [
 8         ‘log‘
 9     ],
10     ‘modules‘ => [
11         ‘v1‘ => [
12             ‘class‘ => ‘api\modules\v1\Module‘
13         ],
14         ‘v2‘ => [
15             ‘class‘ => ‘api\modules\v2\Module‘
16         ]
17     ],
18     ‘controllerNamespace‘ => ‘api\controllers‘,
19     ‘components‘ => [
20         ‘user‘ => [
21             ‘identityClass‘ => ‘common\models\User‘,
22             ‘enableAutoLogin‘ => false,
23             ‘enableSession‘ => false,
24             ‘loginUrl‘ => null
25         ],
26         ‘urlManager‘ => [
27             ‘enablePrettyUrl‘ => true, // 启用美化URL
28             ‘enableStrictParsing‘ => true, // 是否执行严格的url解析
29             ‘showScriptName‘ => false, // 在URL路径中是否显示脚本入口文件
30             ‘rules‘ => [
31                 [
32                     ‘class‘ => ‘yii\rest\UrlRule‘,
33                     ‘controller‘ => [
34                         ‘v1/site‘
35                     ]
36                 ],
37                 [
38                     ‘class‘ => ‘yii\rest\UrlRule‘,
39                     ‘controller‘ => [
40                         ‘v2/site‘
41                     ]
42                 ]
43             ]
44         ],
45         ‘log‘ => [
46             ‘traceLevel‘ => YII_DEBUG ? 3 : 0,
47             ‘targets‘ => [
48                 [
49                     ‘class‘ => ‘yii\log\FileTarget‘,
50                     ‘levels‘ => [
51                         ‘error‘,
52                         ‘warning‘
53                     ]
54                 ]
55             ]
56         ],
57         ‘errorHandler‘ => [
58             ‘errorAction‘ => ‘site/error‘
59         ]
60     ],
61     ‘params‘ => $params
62 ];

main.php

注意10~17行、20~44行的组件配置,相信大家仔细阅读就能明白,此处不再赘述原理,请大家尤其注意33~35行的代码,此处表示的是v1/site控制器,随着接口控制器的增多,可以直接在数组中增加即可。本文力求快速配置出RESTful架构的实现。

(3)v2、v3表示以后的版本变化,配置都类似于v1文件夹。

2、创建一个模型

数据库准备一个名为mxq_guide的数据表

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文件夹中,并注意命名空间的修改。

 1 <?php
 2 namespace api\modules\v1\models;
 3
 4 use Yii;
 5 use yii\db\ActiveRecord;
 6 use yii\web\IdentityInterface;
 7
 8 /**
 9  * This is the model class for table "{{%guide}}".
10  *
11  * @property integer $id
12  * @property string $imgurl
13  * @property integer $status
14  * @property integer $flag
15  */
16 class Guide extends ActiveRecord implements IdentityInterface
17 {
18
19     public static function findIdentityByAccessToken($token, $type = null)
20     {
21         return static::findOne([
22             ‘access_token‘ => $token
23         ]);
24     }
25
26     public function getId()
27     {
28         return $this->id;
29     }
30
31     public function getAuthKey()
32     {
33         return $this->authKey;
34     }
35
36     public function validateAuthKey($authKey)
37     {
38         return $this->authKey === $authKey;
39     }
40
41     public static function findIdentity($id)
42     {
43         return static::findOne($id);
44     }
45
46     public static function tableName()
47     {
48         return ‘{{%guide}}‘;
49     }
50
51     public function rules()
52     {
53         return [
54             [
55                 [
56                     ‘imgurl‘,
57                     ‘status‘,
58                     ‘flag‘
59                 ],
60                 ‘required‘
61             ],
62             [
63                 [
64                     ‘status‘,
65                     ‘flag‘
66                 ],
67                 ‘integer‘
68             ],
69             [
70                 [
71                     ‘imgurl‘
72                 ],
73                 ‘string‘,
74                 ‘max‘ => 255
75             ]
76         ];
77     }
78
79     public function attributeLabels()
80     {
81         return [
82             ‘id‘ => Yii::t(‘app‘, ‘ID‘),
83             ‘imgurl‘ => Yii::t(‘app‘, ‘imgurl‘),
84             ‘status‘ => Yii::t(‘app‘, ‘status‘),
85             ‘flag‘ => Yii::t(‘app‘, ‘flag‘)
86         ];
87     }
88 }

guide.php

3、创建一个控制器

 1 <?php
 2 namespace api\modules\v1\controllers;
 3
 4 use Yii;
 5 use yii\rest\ActiveController;
 6 use yii\filters\auth\CompositeAuth;
 7 use yii\filters\auth\QueryParamAuth;
 8 use yii\data\ActiveDataProvider;
 9
10 class SiteController extends ActiveController
11 {
12
13     public $modelClass = ‘api\modules\v1\models\guide‘;
14
15     public $serializer = [
16         ‘class‘ => ‘yii\rest\Serializer‘,
17         ‘collectionEnvelope‘ => ‘items‘
18     ];
19
20     // public function behaviors()
21     // {
22     // $behaviors = parent::behaviors();
23     // $behaviors[‘authenticator‘] = [
24     // ‘class‘ => CompositeAuth::className(),
25     // ‘authMethods‘ => [
26     // QueryParamAuth::className()
27     // ]
28     // ];
29     // return $behaviors;
30     // }
31     public function actions()
32     {
33         $actions = parent::actions();
34         // 注销系统自带的实现方法
35         unset($actions[‘index‘], $actions[‘update‘], $actions[‘create‘], $actions[‘delete‘], $actions[‘view‘]);
36         return $actions;
37     }
38
39     public function actionIndex()
40     {
41         $modelClass = $this->modelClass;
42         $query = $modelClass::find();
43         return new ActiveDataProvider([
44             ‘query‘ => $query
45         ]);
46     }
47
48     public function actionCreate()
49     {
50         $model = new $this->modelClass();
51         // $model->load(Yii::$app->getRequest()
52         // ->getBodyParams(), ‘‘);
53         $model->attributes = Yii::$app->request->post();
54         if (! $model->save()) {
55             return array_values($model->getFirstErrors())[0];
56         }
57         return $model;
58     }
59
60     public function actionUpdate($id)
61     {
62         $model = $this->findModel($id);
63         $model->attributes = Yii::$app->request->post();
64         if (! $model->save()) {
65             return array_values($model->getFirstErrors())[0];
66         }
67         return $model;
68     }
69
70     public function actionDelete($id)
71     {
72         return $this->findModel($id)->delete();
73     }
74
75     public function actionView($id)
76     {
77         return $this->findModel($id);
78     }
79
80     protected function findModel($id)
81     {
82         $modelClass = $this->modelClass;
83         if (($model = $modelClass::findOne($id)) !== null) {
84             return $model;
85         } else {
86             throw new NotFoundHttpException(‘The requested page does not exist.‘);
87         }
88     }
89
90     public function checkAccess($action, $model = null, $params = [])
91     {
92         // 检查用户能否访问 $action 和 $model
93         // 访问被拒绝应抛出ForbiddenHttpException
94         // var_dump($params);exit;
95     }
96 }

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.com/v1/sites,此处就是rest的默认规则。

打*星号位置显示的是正常的效果,如若出现错误,大家可以去YII权威指南——错误检查错误原因。

YII2的ActiveController默认实现了数据的分页效果。

此处演示的是POST方法新建数据库的数据。对应的是modules/controllers/SiteController/actionCreate方法。

如果在数据库的数据层写好数据校验规则,此处提交数据不满足要求的时候就会显示相应的错误。这也是REST的优势之一。比如如下情况,flag我定义的是int型:

接下来演示的是PUT方法更新数据库的数据。对应的是modules/controllers/SiteController/actionUpdate方法。

此处请大家再次注意最上面的URL:http://api.mxq.com/v1/sites/15  此处15代表的是数据库id为15的数据,表示更新数据库ID为15的数据信息。请大家一定注意。RESTful在使用更新和删除数据操作的时候,id不能一表单的形式提交,必须紧跟在URL之后。

接下来演示的是DELETE方法删除数据库的数据。对应的是modules/controllers/SiteController/actionDelete方法。

当返回值为1的时候表示的就是删除操作执行成功。具体原理请大家仔细观察sitecontroller控制器内的函数。



以上就是基于yii2的RESTful的一些简单介绍、实现方法以及测试结果。有什么不正确或遗漏的地方,欢迎大家来补充。后续也会在此基础上进行更新。本人第一次接触yii2框架和RESTful架构,表述如有不对之处,请大家见谅。

时间: 2024-10-18 00:48:00

Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试的相关文章

API接口开发 配置、实现、测试

Yii2 基于RESTful架构的 advanced版API接口开发 配置.实现.测试 环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_rewrite.so 将其前面的#去掉,如果没有找到则添加进去. 找到一下代码 <Directory "C:/phpStudy/Apache/cgi-bin"> AllowOverride

浅谈使用 PHP 进行手机 APP 开发(API 接口开发)

做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),那么我们来探讨下,如何使用php进行手机API接口开发 一.先简单回答两个问题: 1.PHP 可以开发客户端? 答:可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:主要用于服务端的开发.但是,PHP可不仅仅只能在互联网站上发展,一个PHP for Android(PFA)站点表示

使用RAP2和Mock.JS实现Web API接口的数据模拟和测试

最近一直在思考如何对Web API的其接口数据进行独立开发的问题,随着Web API的越来越广泛应用,很多开发也要求前端后端分离,例如统一的Web API接口后,Winform团队.Web前端团队.微信小程序或者APP团队大家可以同步开发,在最初约定一些接口的输入JSON数据和输出JSON数据,但是随着项目的进度开展,这些数据结构一直有所变化,那么我们模拟的JSON数据格式也需要协同变化,但是很不幸既然大家忙着开发,接口协调的事情肯定优先级没那么高,即使每次记得协调接口数据,也不一定能够完全一致

(微信API接口开发) 使用HttpWebRequest进行请求时发生错误:基础连接已关闭,发送时发生错误处理

最近调试原来的微信模拟登陆时发生了"基础连接已关闭,发送时发生错误"的错误提示,原来都是好好的,只是很久没用了. 出错代码如下: ? 1 2 3 4 5 6 7 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN");///cgi-bin/loginpage?

Restful风格API接口开发springMVC篇

Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. 在Restful风格中,用户请求的url使用同一个url而用请求方式:get,post,delete,put...等方式对请求的处理方法进行区分,这样可以在前后台分离式的开发中使得前端开发人员不会对请求的资源地址产生混淆和大量的检查方法名的麻烦,形成一个统一的接口. 在Restful风格中,现

浅谈 PHP 与手机 APP 开发(API 接口开发)

本文内容转载自:http://www.thinkphp.cn/topic/5023.html 这个帖子写给不太了解PHP与API开发的人 一.先简单回答两个问题: 1.PHP 可以开发客户端?答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发.(别去纠结 GTK.WinBinder) 2.为什么选择 PHP 作为开发服务端的首选?答:跨平台(可以运行在UNIX.LINUX.WINDOWS.Mac OS下).低消耗(PHP消耗相当少的系统资源).运

聊聊 PHP 与手机 APP 开发(API 接口开发)

对于新手开发api接口的一探讨 一.先简单回答两个问题: 1.PHP 可以开发客户端?答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发.(别去纠结 GTK.WinBinder) 2.为什么选择 PHP 作为开发服务端的首选?答:跨平台(可以运行在UNIX.LINUX.WINDOWS.Mac OS下).低消耗(PHP消耗相当少的系统资源).运行效率高(相对而言).MySQL的完美搭档,本身是免费开源的,...... 二.如何使用 PHP 开发 A

API接口开发简述

作为最流行的服务端语言PHP(PHP: Hypertext Preprocessor),在开发API方面,是很简单且极具优势的.API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞生很多专门API服务的公司,如:聚合数据(https://www.juhe.cn/).百度APIStore(http://apistore.baidu.com/) 先了解下 API :1.API 比开发 WEB 更简洁,但

浅谈PHP与手机APP开发(API接口开发)

1 了解PHP与API开发 2 一.先简单回答两个问题: 3 4 1.PHP 可以开发客户端? 5 答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 C/S架构 的S部分,即:服务端的开发.(别去纠结 GTK.WinBinder) 6 7 2.为什么选择 PHP 作为开发服务端的首选? 8 答:跨平台(可以运行在UNIX.LINUX.WINDOWS.Mac OS下).低消耗(PHP消耗相当少的系统资源).运行效率高(相对而言).MySQL的完美搭档,本身是免费开源的,...... 9