写点什么

Yii2.0 RESTful API 之速率限制

用户头像
Middleware
关注
发布于: 2020 年 05 月 27 日

什么是速率限制?

权威指南翻译过来为限流,为防止滥用,你应该考虑对您的 API 限流。 例如,您可以限制每个用户 10 分钟内最多调用 API 100 次。 如果在规定的时间内接收了一个用户大量的请求,将返回响应状态代码 429 (这意味着过多的请求)。



要启用速率限制,首先需要实现认证类,而关于认证的章节我在 Yii2.0 RESTful API 认证教程 进行了详细的阐述,本篇就不过多介绍,再次基础上进行操作

启用速率限制



翻阅权威指南,我们可以看到要启用速率限制首先 认证类 需要继承 [yii\filters\RateLimitInterface](https://www.yiichina.com/doc/api/2.0/yii-filters-ratelimitinterface)



生成两个关键字段

php yii migrate/create add_allowance_and_allowance_updated_at_to_user


修改 刚才的迁移文件

/**
* {@inheritdoc}
*/
public function safeUp()
{
$this->addColumn('user', 'allowance', $this->integer());
$this->addColumn('user', 'allowance_updated_at', $this->integer());
}

/**
* {@inheritdoc}
*/
public function safeDown()
{
$this->dropColumn('user', 'allowance');
$this->dropColumn('user', 'allowance_updated_at');
}

执行迁移

php yii migrate



编写认证类,并继承 RateLimitInterface

namespace api\models;

use Yii;
use yii\base\NotSupportedException;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
use yii\filters\RateLimitInterface;
use yii\web\IdentityInterface;

class User extends ActiveRecord implements IdentityInterface,RateLimitInterface
{
.
.
.
}



实现 RateLimitInterface 所需要的方法

public function getRateLimit($request, $action)
{
return [1, 1]; // $rateLimit requests per second
}

public function loadAllowance($request, $action)
{
return [$this->allowance, $this->allowance_updated_at];
}

public function saveAllowance($request, $action, $allowance, $timestamp)
{
$this->allowance = $allowance;
$this->allowance_updated_at = $timestamp;
$this->save();
}



控制器中实现调用

use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;
use yii\filters\RateLimiter;

public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['rateLimiter'] = [
'class' => RateLimiter::className(),
'enableRateLimitHeaders' => true,
];
$behaviors['authenticator'] = [
'class' => CompositeAuth::className(),
'authMethods' => [
//Http::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
],
];
//$behaviors['rateLimiter']['enableRateLimitHeaders'] = true;
return $behaviors;
}



ok,请求下你的 action,多次请求如果出现 429,那么表示速率限制启用成功



以上就是关于 Yii2.0 速率限制的使用,速率限制需要和认证配合着使用,关于认证的,查阅Yii2.0 RESTful API 认证教程 ,这篇文章,推荐您,先看完认证,先做完认证的功能,然后在启用速率限制



关于 Yii2.0 RESTFul API到此我觉得就结束了,核心功能就是这些,剩下的就是具体的实战了,多练、多敲,



一共四篇文章,分别为:



Yii2.0 RESTful API 基础配置教程



Yii2.0 RESTful API 认证教程



Yii2.0 RESTful API 之版本控制



Yii2.0 RESTful API 之速率限制



发布于: 2020 年 05 月 27 日阅读数: 56
用户头像

Middleware

关注

PHP 打杂工 2018.03.21 加入

https://laravelcode.cn

评论

发布
暂无评论
Yii2.0 RESTful API 之速率限制