Yii2.0 实现API接口

版权声明:博客注明来源即可。 https://blog.csdn.net/u014027680/article/details/79237305

来源:我的博客站 OceanicKang |《Yii2.0 实现API接口》

##第一步
复制一份backend并且改名为api,打开config里的main.php,将id修改为app-id
这里写图片描述

##第二步

#####1.修改components里的user

'user' => [
    'identityClass' => 'common\models\member\Member',
    'enableAutoLogin' => true,
    'enableSession' => false,
],

#####2.在components里添加response, 这串代码的用途是让api请求均为200,其他http状态码会以json数据返回

举个例子:api请求原本为502错误。但我加上这段配置以后,api请求就会变成200,不会报502。但是api返回的json数据就会变成(当然,前提是你api返回规范就是json数据)

 {'error':502,'msg':'502 Bad Gateway','data':...}
'response' => [
    'class' => 'yii\web\Response',
    'on beforeSend' => function ($event) {
        $response = $event -> sender;
        $res_data = $response -> data;
        if ($response->data !== null && !isset($res_data['error'])) {
            $response -> data = [
                'error' => $res_data['status'],
                'msg' => $res_data['message'],
                'data' => [
                    'name' => $res_data['name'],
                    'code' => $res_data['code'],
                    'type' => $res_data['type'],
                ],
            ];
            $response -> statusCode = 200;
        }
    },
],

#####3.在components里添加urlManager,这里就是你要配置的api(写好API方法一定要在这里注册上去!!!)

'urlManager' => [
    'class' => 'yii\web\UrlManager',
    'enablePrettyUrl' 		=> true,
    'enableStrictParsing' 	=> true,
    'showScriptName' 		=> false,
    'suffix'                => '.html', // api后缀
    'rules' => [
		#################
		##  Order API  ##
        #################
        # http://域名/api/v1/order
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => ['v1/order'],
            'pluralize'  => false, // 关闭复数模式
            'extraPatterns' => [
                'GET detail'       => 'detail', // 以GET请求 http://域名/api/v1/order/detail.html
            ]
        ],
    ]
],

##第三步
编写基类控制器
在controllers里创建AController.php

<?php
namespace api\controllers;

use Yii;
use yii\rest\ActiveController;
use yii\web\Response;
use yii\filters\auth\QueryParamAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\CompositeAuth;
use yii\filters\Cors;

class AController extends ActiveController
{
    public function behaviors()
    {
        $behaviors = parent::behaviors();
        
        $behaviors['authenticator'] = [
                'class' => CompositeAuth::className(),
                'authMethods' => [
                        # 下面是三种验证access_token方式
                        //HttpBasicAuth::className(),
                        //HttpBearerAuth::className(),
                        # 这是GET参数验证的方式
                        # http://10.10.10.252:600/user/index/index?access-token=xxxxxxxxxxxxxxxxxxxx
                        QueryParamAuth::className(),
                ],
                // 写在optional里的方法不需要token验证
                'optional' => [],
        ];
		// 这个是跨域配置
        $behaviors['corsFilter'] = [
            'class' => Cors::className(),
            'cors' => [
                'Origin' => ['*'],
                // restrict access to
                'Access-Control-Request-Method' => ['POST', 'GET', 'DEL'],
                // Allow only POST and PUT methods
                'Access-Control-Request-Headers' => ['Origin', 'X-Requested-With', 'Content-Type', 'Accept'],
                // Allow only headers 'X-Wsse'
                'Access-Control-Allow-Credentials' => true,
                // Allow OPTIONS caching
                'Access-Control-Max-Age' => 3600,
                // Allow the X-Pagination-Current-Page header to be exposed to the browser.
                'Access-Control-Expose-Headers' => ['X-Pagination-Current-Page'],
            ],
        ];
        

        #定义返回格式是:JSON
        $behaviors['contentNegotiator']['formats']['text/html'] = Response::FORMAT_JSON;
        return $behaviors;
    }
}

##第四步
开始你的api工程吧!!!
我就先放上我的Logout退出登录给各位参考一下!

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

use Yii;
use api\modules\v1\controllers\AController;
use api\modules\v1\models\LoginForm;

class SiteController extends AController
{
    public $modelClass = 'api\modules\v1\models\Member';

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        unset($behaviors['authenticator']['optional']); // 销毁基类的optional
        // 重写optional 不需要token验证的方法login
        $behaviors['authenticator']['optional'] = [
            'login',
        ];
        
        return $behaviors;
    }

    public function actions()
    {
        $actions = parent::actions();
		// 这一些都是Yii自带的RESTful API方法,我都给销毁了,因为...RESTful风格不太会,哈哈
        unset($actions['index']);  
        unset($actions['view']);
        unset($actions['create']);  
        unset($actions['update']);  
        unset($actions['delete']);

        return $actions;
    }

    /**
     * 退出登录
     */
    public function actionLogout()
    {
	    $msgdata = [
			'error' => 1,
			'msg' => '未知错误',
		];
        if((new LoginForm) -> logout()) {
            $msgdata = [
                'error' => 0,
                'msg' => '退出成功',
            ];
        }else {
            $msgdata['msg'] = '退出失败';
        }

        return $msgdata; // 因为基类有配置过返回格式转换为json,所以直接return不搭嘎
        // 当然也可以自己json_encode一下
    }
}

小生这厢有礼了(๑´ڡ`๑)

猜你喜欢

转载自blog.csdn.net/u014027680/article/details/79237305
今日推荐