400 Bad Request 是因为csrf-token 没有被发送,当您使用POST 提交页面或ajax 请求时,该请求需要防止Yii 跨站点攻击,如果您创建一个ActiveForm 然后它会使用令牌值自动创建一个输入。
您没有添加用于 ajax 调用的代码,因此不清楚您是仅将它用于一个字段还是整个表单,因此我建议仅相关部分。
您需要发送 csrf-token,您可以通过 javascript 使用 yii.js 并调用这 2 个方法来获取它
-
yii.getCsrfParam()获取token的参数名称
-
yii.getCsrfToken()获取csrf-token的token或实际值
csrfParam 名称在frontend/config.php 或config/web.php 中配置,具体取决于您在request 组件下使用的应用程序(高级/基本),如下所示
'components'=>[
......
......
'request' => [
'csrfParam' => '_csrf-frontend',
],
......
......
]
所以你需要做的是将请求方法从POST更改为GET并通过查询字符串发送数据,或者使用以下方式发送POST请求。
Note: You should change the URL and add the csrf data into your existing data that you are sending with the request
let data={};
data[yii.getCsrfParam()]=yii.getCsrfToken();
$.ajax(
{
method:"POST",
url:"/site/test",
data:data,
success:function(data) {
console.log(data);
},
error:function(jqXHR,textStatus,errorThrown) {
console.log(jqXHR,textStatus,errorThrown);
}
}
);
如果您在SiteController 中有一个test 操作并带有以下代码,那么上面的ajax 调用应该会在控制台内向您显示$_POST 数组,其中csrf 参数和令牌值为key=>value。
public function actionTest()
{
print_r($_POST);
}