如果你的控制器末端不是复数(比如是blog非blogs)请保证请求的时候是复数!这是因为在RESTful架构中,网址中只能有名词而不能包含动词,名词又往往与数据表相对应,数据表呢又是一个“集合”,因此该名词往往是复数的形式。
7、关于授权认证
为什么需要授权认证?这在一般的操作中是需要的。比如说用户要设置自己的信息。
为了对yii2 restful授权认证说的更清楚,我们将会以两个两种不同的方法进行说明。
首先需要开启认证:
假设我们已经按照第3步创建了包含字段access-token的数据表user,而且利用gii上生成了相应的model和controller
配置main.php文件
'components' => [ 'user' => [ 'identityClass' => 'common\models\User', 'enableAutoLogin' => true, 'enableSession'=>false ], ],
为控制器配置authenticator行为指定认证方式
<?php namespace api\modules\v1\controllers; use yii\rest\ActiveController; use yii\helpers\ArrayHelper; use yii\filters\auth\QueryParamAuth; class UserController extends ActiveController { public $modelClass = 'api\models\User'; public function behaviors() { return ArrayHelper::merge (parent::behaviors(), [ 'authenticator' => [ 'class' => QueryParamAuth::className() ] ] ); } }
最后我们还需要在identityClass中实现findIdentityByAccessToken方法
public static function findIdentityByAccessToken($token, $type = null) { return static::findOne(['access_token' => $token, 'status' => self::STATUS_ACTIVE]); }
如此一来,我们先通过postman模拟不带access-token请求看结果
{ "name": "Unauthorized", "message": "You are requesting with an invalid credential.", "code": 0, "status": 401, "type": "yii\\web\\UnauthorizedHttpException" }
提示401 我们没有权限访问!
我们在请求的链接上携带正确的access-token,认证通过后,控制器会再继续执行其他检查(频率限制、操作权限等),才可以返回正确的用户信息。
需要提醒的是:通过url的形式对access-token传递存在一定的风险,有可能会造成数据的泄漏!一般而言,access-token需要放到HTTP头中进行传递!除非客户端的请求是jsonp格式的!
8、速率限制
速率限制,该操作完全也是出于安全考虑,我们需要限制同一接口某时间段过多的请求。
速率限制默认不启用,用启用速率限制,yii\web\User::identityClass 应该实现yii\filters\RateLimitInterface,也就是说我们的common\models\User.php需要实现yii\filters\RateLimitInterface接口的三个方法,具体代码可参考:
use yii\filters\RateLimitInterface; use yii\web\IdentityInterface; class User extends ActiveRecord implements IdentityInterface, RateLimitInterface { // other code ...... // 返回某一时间允许请求的最大数量,比如设置10秒内最多5次请求(小数量方便我们模拟测试) public function getRateLimit($request, $action){ return [5, 10]; } // 回剩余的允许的请求和相应的UNIX时间戳数 当最后一次速率限制检查时 public function loadAllowance($request, $action){ return [$this->allowance, $this->allowance_updated_at]; } // 保存允许剩余的请求数和当前的UNIX时间戳 public function saveAllowance($request, $action, $allowance, $timestamp){ $this->allowance = $allowance; $this->allowance_updated_at = $timestamp; $this->save(); } }
需要注意的是,你仍然需要在数据表User中新增加两个字段
allowance:剩余的允许的请求数量
allowance_updated_at:相应的UNIX时间戳数
在我们启用了速率限制后,Yii 会自动使用 yii\filters\RateLimiter 为 yii\rest\Controller 配置一个行为过滤器来执行速率限制检查。
现在我们通过postman请求v1/users再看看结果,会发现在10秒内调用超过5次API接口,我们会得到状态为429太多请求的异常信息。
{ "name": "Too Many Requests", "message": "Rate limit exceeded.", "code": 0, "status": 429, "type": "yii\\web\\TooManyRequestsHttpException" }
9、关于版本
为了兼容历史版本而且考虑向后兼容性,我们在一开始操作的时候就以URL的方式实现了版本话,这里就不再进行阐述了。
10、错误处理
Yii的REST框架的HTTP状态代码可参考如下就好,没啥好说的
200: OK。一切正常。
201: 响应 POST 请求时成功创建一个资源。Location header 包含的URL指向新创建的资源。
204: 该请求被成功处理,响应不包含正文内容 (类似 DELETE 请求)。
304: 资源没有被修改。可以使用缓存的版本。
400: 错误的请求。可能通过用户方面的多种原因引起的,例如在请求体内有无效的JSON 数据,无效的操作参数,等等。
401: 验证失败。
403: 已经经过身份验证的用户不允许访问指定的 API 末端。
404: 所请求的资源不存在。
405: 不被允许的方法。 请检查 Allow header 允许的HTTP方法。
415: 不支持的媒体类型。 所请求的内容类型或版本号是无效的。
422: 数据验证失败 (例如,响应一个 POST 请求)。 请检查响应体内详细的错误消息。
429: 请求过多。 由于限速请求被拒绝。
500: 内部服务器错误。 这可能是由于内部程序错误引起的。
您可能感兴趣的文章: