yii2框架-restful的基础入门(二十一)

今天给人的感觉就是“热,很热,热中暑”!
最近的高温天气简直让人不能活啊,听说华中地区的温度居然超过40度,广东的温度也接近37度,户外工作的真的做好避暑咯!
趁着今天工作之余,感觉总的写些什么东西。现在回想起来,自己学习编程也接近3年了,从大三开始正式学习php,当时是跟着LAMP兄弟连的老师一边看视频,一边查找资料,一边练习,做些小的模块,比如登录,分页,简单的CURD等等。到后来逐渐接触thinkphp框架,学习mvc开发模式,了解php自动注册机制,命名空间,类库,魔术方法等,自己是一直在慢慢进步,也遇到过很多的困难,也得到很多人的帮助。
现在工作一年多的时间里,在实际的项目目中,用到和学到的知识就更多,mongodb,redis,nginx,集群,ffmpeg,nodejs,angularjs,workerman,swoole,yii2框架,还有各种开源的类库或者组件等!google,百度,github,各种技术论坛,例如推酷,脚本之家,开源中国等等,这些都成为了这三年来陪伴我的伙伴。
今天想写的应该是关于yii2的restful api部分。作为一名软件研发的工程师,其实我们的项目应用中是经常做一些接口的,给第三方调用。
restful 是一种设计的规范,表述的是一种状态转移(可以自己百度了解),URI代表的是一种直观的请求资源。
当然,设计restful api 只是为了更加规范设计接口而已,并不是说一定就要按照restful的规范去设计,利用我们平常的post或者get的方式也是可以的,只是看起来并没有那么的直观明了,所以说设计的接口这个要根据自己的业务来做设计。
下面我们来了解一下设计接口一般要满足什么的条件?
(1)API的URL(或者URI)
(2)认证和授权API。必须要认证才能合法通过api访问内容
(3)传递的数据。以get或者post的方式传json类型数据或者其他类型
(4)返回的数据格式。以json数据格式返回,当然还要包括状态码,信息,返回的数据这三者
(5)api版本化。其实还会有一个很重要的额外条件就是API的版本化,这个是非常重要的。
以上5个应该是最简单的api接口条件了。
yii2的restful api 是一种规范设计的API,当然也是满足以上的4个条件的。

这是权威指南:http://www.yiichina.com/doc/guide/2.0/rest-quick-start,可以认真看看。


首先我们在yii2的高级框架中将api接口作为一个应用,也就是和fronted,backend是同级的应用。那么我们就可以在api这个应用中以模块化设计来实现版本化的设计。


简单地说,就是一个v1模块,代表v1版本,接口升级时,定义v2的模块,代表v2版本,这样子不论是v1,v2的接口都可以使用,比如一个app之前是接入v1版本接口的,现在更新的app,对应接入的v2版本接口,那么这两个app都依然可以使用,两个版本的接口都在服务。
(1)首先我们将fronted文件夹复制,并且粘贴在同一个目录下,重命名为api,那么这个api就是一个接口应用了。
接下来将api里的controllers和models这两个文件夹的所有文件都删除?为什么呢?因为这两个文件夹里面的类的命名空间是fronted开头的(因为我们是复制过来的文件)

(2)修改配置文件

在api的config的文件下面,有一个boostrap.php的文件和main.php的主配置文件,因为这是我们新建的api应用,所以必须要设置api的别名。


在boostrap.php文件中添加:
Yii::setAlias('api', dirname(dirname(__DIR__)) . '/api');
当然我们也可以在common/config/boostrap.php中添加:
Yii::setAlias('api', dirname(dirname(__DIR__)) . '/api');
因为这个common/config/boostrap.php就是设置应用别名的,里面代码:
Yii::setAlias('@common', dirname(__DIR__));
Yii::setAlias('@frontend', dirname(dirname(__DIR__)) . '/frontend');
Yii::setAlias('@backend', dirname(dirname(__DIR__)) . '/backend');
Yii::setAlias('@console', dirname(dirname(__DIR__)) . '/console');
所以可以在这里添加设置api的别名,直接添加
Yii::setAlias('api', dirname(dirname(__DIR__)) . '/api');
那么还有一个main.php的主配置文件需要配置controllerNamespace属性

'controllerNamespace' => 'api\controllers',

'modules' => [
        'v1' => [
            'class' => 'api\modules\v1\Module'
        ]

],

其他的配置就按照web应用常规配置就可以了

(3)核心的控制器yii\rest\ActiveController

这个核心的控制器是设计restful的base类,我们创建的控制器必须继承这个yii\rest\ActiveController

<?php
namespace api\modules\v1\controllers;//利用gii产生模块v1,也就是v1版本

use yii\rest\ActiveController;

class UserController extends ActiveController
{
    public $modelClass = 'api\modules\v1\models\User';//对应的数据模型处理控制器
}
通过指定 yii\rest\ActiveController::modelClass 作为 api\modules\v1\models\User, 控制器就能知道使用哪个模型去获取和处理数据。
当然这个api\modules\v1\models\User是可以直接继承\yii\db\ActiveRecord的

<?php
namespace api\modules\v1\models;

use Yii;
use api\models\Order;
use yii\db\ActiveRecord
class User extends ActiveRecord
{

}

(4)配置路由组件

'urlManager' => [
    'enablePrettyUrl' => true,
    'enableStrictParsing' => true,
    'showScriptName' => false,
    'rules' => [
        [
        	'class' => 'yii\rest\UrlRule',
         	'controller' => ['v1/user']
        ],
    ],
]
随着以上所做的最小的努力,你已经完成了创建用于访问用户数据 的 RESTful 风格的 API。你所创建的 API 包括:

GET /users: 逐页列出所有用户
POST /users: 创建一个新用户
PUT /users/123: 更新用户123
DELETE /users/123: 删除用户123
PATCH /users/123 更新用户123
OPTIONS /users: 显示关于末端 /users 支持的动词
OPTIONS /users/123: 显示有关末端 /users/123 支持的动词
HEAD /users: 显示用户列表的概要信息
HEAD /users/123: 显示用户 123 的概述信息

大家可以在yiisoft/yii2/rest文件夹下面看到很rest组件的各个文件。

yii\rest\ActiveController的actions

public function actions()
    {
        return [
            'index' => [
                'class' => 'yii\rest\IndexAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
            ],
            'view' => [
                'class' => 'yii\rest\ViewAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
            ],
            'create' => [
                'class' => 'yii\rest\CreateAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
                'scenario' => $this->createScenario,
            ],
            'update' => [
                'class' => 'yii\rest\UpdateAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
                'scenario' => $this->updateScenario,
            ],
            'delete' => [
                'class' => 'yii\rest\DeleteAction',
                'modelClass' => $this->modelClass,
                'checkAccess' => [$this, 'checkAccess'],
            ],
            'options' => [
                'class' => 'yii\rest\OptionsAction',
            ],
        ];
    }
分别对应不同的独立的操作,这些独立的操作也对应这不同的访问urlrules。在yii/rest/UrlRule中

public $patterns = [
    'PUT,PATCH {id}' => 'update',
    'DELETE {id}' => 'delete',
    'GET,HEAD {id}' => 'view',
    'POST' => 'create',
    'GET,HEAD' => 'index',
    '{id}' => 'options',
    '' => 'options',
];
简单地说,当我们
a)以get方法访问http://localhost/lianxi/XML/advanced/api/web/v1/users,其实对应的独立操作就是yii/rest/IndexAction
b)以post方法访问http://localhost/lianxi/XML/advanced/api/web/v1/users,其实对应的独立操作就是yii/rest/CreateAction。
c)以get方法访问http://localhost/lianxi/XML/advanced/api/web/v1/users/1,就是获取id=1的用户,对应的独立操作yii/rest/ViewAction。
d)以put,patch方式访问http://localhost/lianxi/XML/advanced/api/web/v1/users/1,就是更改id=1的用户的信息,对应的独立操作yii/rest/UpdateAction。
这四个是常见的CURD操作。
那么我们可以如何测试这些接口呢?
利用google的开发工具postman可以很直观轻松的进行接口的测试。
get方式获取所有用户



post方式创建新用户


get方式获取id=1的用户


put方式更新id=1的用户名为‘成龙’


delete方式删除id=29的用户







  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值