[ "identityClass" => "commonmodelsmemberM" />
牛骨文教育服务平台(让学习变的简单)
博文笔记

Yii2.0 实现API接口

创建时间:2018-02-02 投稿人: 浏览次数:273

第一步

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

第二步

1.修改components里的user
"user" => [
    "identityClass" => "commonmodelsmemberMember",
    "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" => "yiiwebResponse",
    "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" => "yiiwebUrlManager",
    "enablePrettyUrl"       => true,
    "enableStrictParsing"   => true,
    "showScriptName"        => false,
    "suffix"                => ".html", // api后缀
    "rules" => [
        #################
        ##  Order API  ##
        #################
        # http://域名/api/v1/order
        [
            "class" => "yii
estUrlRule",
            "controller" => ["v1/order"],
            "pluralize"  => false, // 关闭复数模式
            "extraPatterns" => [
                "GET detail"       => "detail", // 以GET请求 http://域名/api/v1/order/detail.html
            ]
        ],
    ]
],

第三步

编写基类控制器
在controllers里创建AController.php

<?php
namespace apicontrollers;

use Yii;
use yii
estActiveController;
use yiiwebResponse;
use yiifiltersauthQueryParamAuth;
use yiifiltersauthHttpBasicAuth;
use yiifiltersauthCompositeAuth;
use yiifiltersCors;

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 apimodulesv1controllers;

use Yii;
use apimodulesv1controllersAController;
use apimodulesv1modelsLoginForm;

class SiteController extends AController
{
    public $modelClass = "apimodulesv1modelsMember";

    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一下
    }
}

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

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。