Yii2下rest项目搭建与使用

6 篇文章 0 订阅

yii2中使用rest的方法和正常的项目目录接口没什么太大区别有几处需要注意的是

1、在controller创建的时候继承的类由一般web项目的yii\web\Controller换成yii\rest\Controller,但是一般会使用中间类继承yii\rest\Controller,以便重写相关函数的处理,假设类名为ApiController;

2、在ApiController类中重写init函数,enableSession设置为false:

public function init()
{
    parent::init();

    \Yii::$app->user->enableSession = false;
}

3、关于接口登录态验证的变化,web项目的action的登录态验证直接是在behaviors函数中控制的。如下:


  /**
     * @inheritdoc
   */
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => yii\filters\VerbFilter::className(),
                'actions' => [
                ],
            ],
            'access' => [
                'class' => yii\filters\AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => [''],//页面访问不需要的登录态验证的
                        'roles' => ['?'],
                    ],
                    [
                        'allow' => true,
                        'actions' => [ 'view','update','create'],//页面访问需要登录态验证的
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];

    }

rest框架中使用的登录态的认证虽然也是behaviors函数中完成的,但是验证的函数以及方式不同的,web项目的登录态验证通常使用的是session验证的机制,但是rest一般使用的是token验证的方法,登录成功返回给客户端存在本地,客户端每次访问接口的时候再带过来,具体的形式有三种QueryParamAuth、HttpBearerAuth、HttpBasicAuth,这里举例HttpBearerAuth简单验证版,重写以后的类为LHttpBearerAuth,behaviors函数如下(举例用户模块):

   
    public function behaviors()
    {
        return ArrayHelper::merge(parent::behaviors(), [
            'authenticator' => [
                'authMethods' =>[
                        LHttpBearerAuth::className(), // 默认需要登录态验证
                ],
                'except' => [ // 添加不需要登录态验证的接口
                    'login',
                    'sign-up',
                    'find-pwd',
                    'reset-pwd',
                ],
            ],
            'verbFilter' => [
                'class' => yii\filters\VerbFilter::className(),
                'actions' =>[
                        'login' => ['POST','OPTIONS'],
                ],
            ],

        ] );

LHttpBearerAuth类如下:


class LHttpBearerAuth extends HttpBearerAuth
{

    /**
     * @inheritdoc
     */
    public function authenticate($user, $request, $response)

    {

        if ($request->isOptions) // 搭配前端vue跨域请求使用处理cors的预请求

       {

            $response->statusCode = 200;
            \Yii::$app->end();
        }else{
            $authHeader = $request->getHeaders()->get('Authorization');
            if ($authHeader !== null && preg_match("/^Bearer\\s+(.*?)$/", $authHeader, $matches)) {
                $identity = $user->loginByAccessToken($matches[1], get_class($this));
                if ($identity === null) {
                    $this->handleFailure($response);
                }
                return $identity;
            }
        }
        return null;
    }


    /**
     * @inheritdoc
     */
    public function handleFailure($response)
    {
        ApiController::exceptionToCode(array(
                "retCode" => XXX
                "retMsg" => XXX,
                "retData" => [],
        ));

    }

}

前端访问接口的时候需要传入header参数Authorization为XXXXXXX(此处应与解析的规则一致即可)

主要目录如下:








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值