VerbFilter 是针对 HTTP 请求方式的过滤器,作用是定义访问指定动作所允许的HTTP请求,若不允许的HTTP请求到来,则会抛出一个 HTTP 405 错误。若不指定允许的请求方式,则默认允许当所有类型的请求方式 。
接下来,试一试 VerbFilter 的简单使用。
首先,在 SiteController 中添加代码
public function actionInfo()
{
return \Yii::createObject([
'class' => 'yii\web\Response',
'format' => \yii\web\Response::FORMAT_JSON,
'data' => [
'message' => 'hello world',
'code' => 100,
],
]);
}
上述代码,返回一个利用
FORMAT_JSON
格式化的字符串
{"message":"hello world","code":100}
public function behaviors()
{
return [
... ...
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
'info' => ['post'],
],
],
];
}
上述代码,在 behaviors() 中使用了过滤器
VerbFilter ,指明访问动作 info 时,只能使用 POST 请求方式
再次修改代码,
public function behaviors()
{
return [
... ...
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
'info' => ['post','get'],
],
],
];
}
允许POST和GET两种请求方式访问动作Info,使用RESTClient工具访问,选择 GET 请求方式进行访问的时候获取到返回值
{"message":"hello world","code":100}
这时候,修改 web.php 文件,
'request' => [
// !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
'cookieValidationKey' => '4mWc84oNsYJpc-nnnjMwyOOiCTgcThig',
'enableCookieValidation' => false,
'enableCsrfValidation' => false,
],
添加上这两行代码,警用cookie保护与CSRF防范策略
'enableCookieValidation' => false,
'enableCsrfValidation' => false,
再次通过 post 发送请求访问,成功。
input:_csrf
进行验证,验证通过才可以正常进行访问;
csrf验证
的。
在 SiteController 中添加代码
public function actionApitest(){
$request = Yii::$app->request;
if ($request->isGet) {
echo "the request method is GET" . "\n";
echo "-------\$request->get('id')---------\n";
$id = $request->get('id');
// equivalent to: $id = isset($_GET['id']) ? $_GET['id'] : null;
echo $id . "\n";
echo "-------\$request->get('id','null')---------\n";
$id = $request->get('id','null');
// equivalent to: $id = isset($_GET['id']) ? $_GET['id'] : 1;
echo $id . "\n";
}
if ($request->isPost) {
echo "the request method is POST" . "\n";
echo "-------\$_POST------------------\n";
echo var_dump($_POST) . "\n";
echo "-------php://input-------------\n";
$content = file_get_contents('php://input');
echo $content . "\n";
//echo json_encode($content). "\n";
echo "-------request->post('message', 'other')---------\n";
$message = $request->post('message', 'null');
echo $message ;
}
}
用GET方式请求 URL:http://localhost/basic/web/index.php?r=site/apitest&id=1,返回
the request method is GET
-------$request->get('id')---------
1
-------$request->get('id','null')---------
1
the request method is GET
-------$request->get('id')---------
-------$request->get('id','null')---------
null
{
"message": "hello world",
"code": 100
}
返回结果为:
the request method is POST
-------$_POST------------------
array(0) {
}
-------php://input-------------
{
"message": "hello world",
"code": 100
}
-------request->post('message', 'other')---------
null