一个没有认证的API应用
首先, Controller
基类behaviors
方法是默认, 只继承了\yii\rest\Controller
, 没有额外添加认证, 然后自定义了site/error
public function actionError()
{
/** @var \Exception $exception */
$exception = Yii::$app->errorHandler->exception;
if ($exception !== null)
{
$this->setBody($exception->statusCode ?? $exception->getCode(), $exception->getMessage());
return [];
}
此时在自定义方法中throw
异常,根据这个问题(yii2 关于自定义errorHandler的疑问)可知由于API接口为json
响应格式,不会走向site/error
,那么问题是:
如果此时访问一个不存在的方法, 比如/site/sdfjjsfk
, 此时为404NotFound
, 但却走向了site/error
, 返回值与上述直接throw new NotFoundHttpException('')
是不一样的, 这是为什么呢?
// 自定义
{"code":404,"msg":"Page not found.","data":[]}
// throw new NotFoundHttpException
{"name":"Not Found","message":"","code":0,"status":404,"type":"yii\\web\\NotFoundHttpException"}
一个带有认证的API应用
Controller
基类同样继承 \yii\rest\Controller
, behaviors
方法加入认证
$behaviors['authenticator'] = [
'class' => CompositeAuth::class,
'authMethods' => [
[
'class' => TokenAuth::class,
],
],
'except' => $this->except,
'only' => $this->only,
];
自定义方法TokenAuth
继承\yii\filters\auth\HttpBasicAuth
并重写authenticate
方法
class TokenAuth extends \yii\filters\auth\HttpBasicAuth
{
public function authenticate($user, $request, $response)
{
...
if(...)
{
throw new BadRequestHttpException('使用非法客户端');
}
...
}
}
问题是:
在该方法中抛出异常得不到正确的响应, 比如上述应是400, 实际却是500,而在其他behaviors
中表现正常, 比如Verbfilter
使用不正确的HTTP动词会得到正确的异常返回值,那么这种错误能有哪些可能性