Yii2.0 RESTful风格的Controller与ActiveController

yii\rest\Controller提供的大多数RESTful API功能通过过滤器实现. 特别是以下过滤器会按顺序执行:

  • yii\filters\ContentNegotiator: 支持内容协商。
  • yii\filters\VerbFilter: 支持HTTP 方法验证;
  • yii\filters\AuthMethod: 支持用户认证;
  • yii\filters\RateLimiter: 支持频率限制.

这些过滤器都在yii\rest\Controller::behaviors()方法中声明。原本的声明如下:

    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            ‘contentNegotiator‘ => [
                ‘class‘ => ContentNegotiator::className(),
                ‘formats‘ => [
                    ‘application/json‘ => Response::FORMAT_JSON,
                    ‘application/xml‘ => Response::FORMAT_XML,
                ],
            ],
            ‘verbFilter‘ => [
                ‘class‘ => VerbFilter::className(),
                ‘actions‘ => $this->verbs(),
            ],
            ‘authenticator‘ => [
                ‘class‘ => CompositeAuth::className(),
            ],
            ‘rateLimiter‘ => [
                ‘class‘ => RateLimiter::className(),
            ],
        ];
    }

首先是yii\filters\ContentNegotiator过滤器,该过滤器是用于内容协商的,例如,
如果一个 RESTful API 请求中包含以下 header,

Accept: application/json; q=1.0, */*; q=0.1

将会得到JSON格式的响应,幕后,执行一个 RESTful API 控制器动作之前,yii\filters\ContentNegotiator
filter 将检查 HTTP header 在请求时和配置 yii\web\Response::format
为 json。 之后的动作被执行并返回得到的资源对象或集合, yii\rest\Serializer
将结果转换成一个数组。最后,yii\web\JsonResponseFormatter 该数组将序列化为JSON字符串,并将其包括在响应主体。

之后将会执行yii\filters\VerbFilter,这一步是对动词的过滤,参考yii\rest\ActiveController中的声明:

    /**
     * @inheritdoc
     */
    protected function verbs()
    {
        return [
            ‘index‘ => [‘GET‘, ‘HEAD‘],
            ‘view‘ => [‘GET‘, ‘HEAD‘],
            ‘create‘ => [‘POST‘],
            ‘update‘ => [‘PUT‘, ‘PATCH‘],
            ‘delete‘ => [‘DELETE‘],
        ];
    }

所谓的动词即是用户发出的请求的类型,由此对应不同的操作。

然后是yii\filters\AuthMethod和Web应用不同,RESTful
APIs 通常是无状态的,也就意味着不应使用sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过sessions 或 cookies维护, 常用的做法是每个请求都发送一个秘密的access token来认证用户,由于access token可以唯一识别和认证用户。

最后是yii\filters\RateLimiter为防止滥用,你应该考虑增加速率限制到您的API。
例如,您可以限制每个用户的API的使用是在10分钟内最多100次的API调用。 如果一个用户同一个时间段内太多的请求被接收, 将返回响应状态代码 429 (这意味着过多的请求)。

要启用速率限制, yii\web\User::identityClass 应该实现 yii\filters\RateLimitInterface. 这个接口需要实现以下三个方法:

  • getRateLimit(): 返回允许的请求的最大数目及时间,例如,[100,
    600]
     表示在600秒内最多100次的API调用。
  • loadAllowance(): 返回剩余的允许的请求和相应的UNIX时间戳数 当最后一次速率限制检查时。
  • saveAllowance(): 保存允许剩余的请求数和当前的UNIX时间戳。

你可以在user表中使用两列来记录容差和时间戳信息。 loadAllowance() 和 saveAllowance() 可以通过实现对符合当前身份验证的用户
的这两列值的读和保存。为了提高性能,你也可以 考虑使用缓存或NoSQL存储这些信息。

一旦 identity 实现所需的接口, Yii 会自动使用 yii\filters\RateLimiter 为 yii\rest\Controller 配置一个行为过滤器来执行速率限制检查。 如果速度超出限制 该速率限制器将抛出一个 yii\web\TooManyRequestsHttpException。 你可以在你的 REST 控制器类里配置速率限制,

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors[‘rateLimiter‘][‘enableRateLimitHeaders‘] = false;
    return $behaviors;
}

当速率限制被激活,默认情况下每个响应将包含以下HTTP头发送 目前的速率限制信息:

  • X-Rate-Limit-Limit: 同一个时间段所允许的请求的最大数目;
  • X-Rate-Limit-Remaining: 在当前时间段内剩余的请求的数量;
  • X-Rate-Limit-Reset: 为了得到最大请求数所等待的秒数。

你可以禁用这些头信息通过配置 yii\filters\RateLimiter::enableRateLimitHeaders 为false, 就像在上面的代码示例所示。

yii\rest\ActiveController继承了yii\rest\Controller,在这个基础上,封装了基本的RESTful
API:

    /**
     * @inheritdoc
     */
    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‘,
            ],
        ];
    }

在创建自己的RESTful API时可以通过对yii\rest\ActiveController::actions()的重载来对对应的方法进行禁用和允许的设置。同时要对yii\rest\ActiveController::verbs()进行重载:

    /**
     * @inheritdoc
     */
    protected function verbs()
    {
        return [
            ‘index‘ => [‘GET‘, ‘HEAD‘],
            ‘view‘ => [‘GET‘, ‘HEAD‘],
            ‘create‘ => [‘POST‘],
            ‘update‘ => [‘PUT‘, ‘PATCH‘],
            ‘delete‘ => [‘DELETE‘],
        ];
    }

用于处理不同的动作对应的HTTP请求方式。

最后yii\rest\ActiveController提供了一个yii\rest\ActiveController::checkAccess()方法。该方法用于检验当前发起请求的用户是否有权限使用某数据层进行某个操作。

时间: 2024-10-15 01:24:06

Yii2.0 RESTful风格的Controller与ActiveController的相关文章

Yii2.0 RESTful Web服务(4)

路由 随着资源和控制器类准备,您可以使用URL如 http://localhost/index.php?r=user/create访问资源,类似于你可以用正常的Web应用程序做法. 在实践中,你通常要用美观的URL并采取有优势的HTTP动词. 例如,请求POST /users意味着访问user/create动作. 这可以很容易地通过配置urlManager应用程序组件来完成 如下所示: 'urlManager' => [ 'enablePrettyUrl' => true, 'enableSt

Yii2实现RESTful风格的API中要注意的坑

Yii2实现RESTful风格的API的流程如下:1.WEB前端(frontend)和后端(backend)的同级目录,新建一个文件夹,命名api,api中文件完全复制一份原始的backend中文件即可 2.需要修改common\config\bootstrap.php文件,对新建的应用增加alias别名 Yii::setAlias('@api', dirname(dirname(DIR)) . '/api'); 3.保证你的web服务器开启rewrite规则!配置apache或nginx!这里

Yii2.0 RESTful Web服务(1)

快速入门 Yii 提供了一整套用来简化实现 RESTful 风格的 Web Service 服务的 API. 特别是,Yii 支持以下关于 RESTful 风格的 API: 支持 Active Record 类的通用API的快速原型 涉及的响应格式(在默认情况下支持 JSON 和 XML) 支持可选输出字段的定制对象序列化 适当的格式的数据采集和验证错误 支持 HATEOAS 有适当HTTP动词检查的高效的路由 内置OPTIONS和HEAD动词的支持 认证和授权 数据缓存和HTTP缓存 速率限制

Yii2.0 RESTful Web服务(3)

在创建资源类和指定资源格输出式化后,下一步就是创建控制器操作将资源通过RESTful APIs展现给终端用户. Yii 提供两个控制器基类来简化创建RESTful 操作的工作:yii\rest\Controller 和 yii\rest\ActiveController, 两个类的差别是后者提供一系列将资源处理成ActiveRecord(关于ActiveRecord)的操作. 因此如果使用ActiveRecord内置的操作会比较方便,可考虑将控制器类 继承yii\rest\ActiveContr

Yii2.0 RESTful Web服务(2)

资源 RESTful 的 API 都是关于访问和操作资源,可将资源看成MVC模式中的Model 在如何代表一个资源没有固定的限定,在Yii中通常使用 yii\base\Model 或它的子类(如 yii\db\ActiveRecord) 代表资源,是为以下原因: yii\base\Model 实现了 yii\base\Arrayable 接口,它允许你通过RESTful API自定义你想要公开的资源数据. yii\base\Model 支持输入验证, 在你的RESTful API需要支持数据输入

YII2.0 Restful API 记得配置服务器重写规则哦

<VirtualHost *:80> ServerName api.apitpl.dev DocumentRoot "/Users/michaelweixi/WWWRoot/apitpl/api/web/" <Directory "/Users/michaelweixi/WWWRoot/apitpl/api/web/"> # use mod_rewrite for pretty URL support RewriteEngine on # I

Yii2.0 实现RESTful风格的简单API

一.创建数据库 首先,在mysql中创建一个名为yii2basic的数据库,并创建一张名为player的表. 二.配置 1.app/config/db.php <?php return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2basic', 'username' => 'root', 'password' => '', 'charset' => 'utf8',

SpringMVC:Controller 及 RestFul风格

SpringMVC:Controller 及 RestFul风格 控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现. 控制器负责解析用户的请求并将其转换为一个模型. 在Spring MVC中一个控制器类可以包含多个方法 在Spring MVC中,对于Controller的配置方式有很多种 我们来看看有哪些方式可以实现: Controller是一个接口,在org.springframework.web.servlet.mvc包下,接口中只有一个方

restful风格url Get请求查询所有和根据id查询的合并成一个controller

restful风格url Get请求查询所有和根据id查询的合并成一个controller的方法 原代码 // 127.0.0.1:8080/dep/s @ApiOperation(value="查询所有", notes="查询所有") @RequestMapping(value = "/s",method = RequestMethod.POST) public List<Dep> deps() { return depServic