环境配置:

开启服务器伪静态

本处以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架构,表述如有不对之处,请大家见谅。

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

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

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

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

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

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

    参考地址: http://www.xiaoxiangzi.com/Programme/PHP/3348.html http://www.cnblogs.com/ganiks/p/yii2-restfu ...

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

    Yii2 基于RESTful架构的 advanced版API接口开发 配置.实现.测试 环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到 ...

  5. 基于Node和Electron开发了轻量版API接口请求调试工具——Post-Tool

    Electron 是一个使用 JavaScript.HTML 和 CSS 构建桌面应用程序的框架. 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 Java ...

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

    最近一直在思考如何对Web API的其接口数据进行独立开发的问题,随着Web API的越来越广泛应用,很多开发也要求前端后端分离,例如统一的Web API接口后,Winform团队.Web前端团队.微 ...

  7. 基于Groovy+HttpRestful的超轻量级的接口测试用例配置的设计方案及DEMO实现

    目标 设计一个轻量级测试用例框架,接口测试编写者只需要编写测试用例相关的内容(入参及结果校验),不需要理会系统的实现,不需要写跟测试校验无关的内容. 思路 测试用例分析 一个用例由以下部分组成: (1 ...

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

    做过 API 的人应该了解,其实开发 API 比开发 WEB 更简洁,但可能逻辑更复杂,因为 API 其实就是数据输出,不用呈现页面,所以也就不存在 MVC(API 只有 M 和 C),那么我们来探讨 ...

  9. 示例浅谈PHP与手机APP开发,即API接口开发

    示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...

随机推荐

  1. asp.net MVC 路由系统

    ASP.NET的路由系统是基于物理文件的路由注册,通过调用System.Routing.RouteTable的Routes(RouteCollection)属性的MapPageRoute()方法来完成 ...

  2. ssh三大框架,三层架构 整合测试!完整分页代码,JdbcTemplate等测试,存储过程调用,留着以后复习吧

    下载地址:http://download.csdn.net/detail/liangrui1988/5760453

  3. 方法输出C++输出斐波那契数列的几种方法

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 定义: 斐波那契数列指的是这样一个数列:0, 1, 1, 2, 3, 5, ...

  4. mybatis使用@param后掉的坑

    项目里面的一个分页拦截器内某段代码需要判断传入的参数是否属于摸个特定的类,如果不是就直接执行下面的流程,坑爹的@param,在DAO里传入的参数前面加上了这个注解,mabaits内部将传入的参数变成了 ...

  5. 微信小程序的动画效果

    前言 由于公司计划有变,所以从H5页面改成去小程序写.所以在着手开发小程序.本人也不是什么前端高手,只是一名写后端偶尔写写前端的渣渣.请前端大神们勿喷. 一.什么是微信小程序? 小程序在我的理解中只是 ...

  6. C语言之逻辑运算符

    一 逻辑运算符: &&:逻辑与,读作并且 表达式左右两边都为真,那么结果才为真 口诀:一假则假 ||:逻辑或,读作或者 表达式左右两边,有一个为真,那么结果就为真 口诀:一真则真 !: ...

  7. springMVC框架中json处理

    1.在项目中导入jackson-core.jar包 2.使用@ResponseBody注解,此注解会自动装换为json 如图: 3.如此,便可以得到json对象

  8. 【转】【WebService】.NET C# 创建WebService服务

    Web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务 WebService的特性有以下几点: 1.使用XML(标准通用标记语言)来作为数据交互 ...

  9. Nginx 防止被域名恶意解析的方法

    今天太倒霉了,发现通过IP无法访问服务器的80端口很无语,昨天都还好的啊,也没有修改过配置,其他端口又是正常的,防火墙也没问题.于是问了下机房,给了个崩溃的回复说我们的服务器有个域名没有备案被电信多次 ...

  10. 关于 CentOS 自启动(服务、脚本)

    /etc/init.d /etc/rc.local 其实是软连接,所以,实际上看 /etc/rc.d/ 这个文件夹就好了 rc.local 是自启动脚本 正常情况下,用户自定义的服务在 init.d ...