1. 程式人生 > >Yii2.0 RESTful API 之速率限制

Yii2.0 RESTful API 之速率限制

Yii2.0 RESTful API 之速率限制

什麼是速率限制?

權威指南翻譯過來為限流,為防止濫用,你應該考慮對您的 API 限流。 例如,您可以限制每個使用者 10 分鐘內最多呼叫 API 100 次。 如果在規定的時間內接收了一個使用者大量的請求,將返回響應狀態程式碼 429 (這意味著過多的請求)。

要啟用速率限制,首先需要實現認證類,而關於認證的章節我在 Yii2.0 RESTful API 認證教程 進行了詳細的闡述,本篇就不過多介紹,再次基礎上進行操作

啟用速率限制

翻閱權威指南,我們可以看到要啟用速率限制首先 認證類 需要繼承 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 之速率限制