You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii框架中如何向控制器方法发起Ajax请求?请求报错求助

Yii框架Ajax POST请求400错误的解决办法

我看你在Yii里发起Ajax POST请求时遇到了400错误,先把你的代码和问题情况理清楚:

你用的JavaScript代码是这样的:

var durl = "<?php echo Yii::$app->getUrlManager()->getBaseUrl(); ?>/Site/ReqAJAX"; 
$.ajax({ 
    type: "POST", 
    url: durl, 
    data: {_csrf:'<?=\Yii::$app->request->csrfToken?>'}, 
    dataType: "json", 
    contentType: "application/json; charset=utf-8", 
    success: function(msg) { 
        alert("Success "+msg); 
    }, 
    error: function(err) { 
        alert(JSON.stringify(err)); 
    } 
}); 

从你提供的报错截图来看,返回的是400 Bad Request,错误提示是Unable to verify your data submission.——这其实是Yii的CSRF验证失败了。

为啥会出错?

你设置了contentType: "application/json; charset=utf-8",但Yii默认是从**表单编码格式(application/x-www-form-urlencoded)**的POST数据里读取_csrf参数的。当你用JSON格式发数据时,Yii没法正确解析到你传的_csrf,自然就判定你的请求不合法,返回400错误了。

两种解决办法任你选

办法1:改用默认表单编码(最简单)

直接把contentType这一行删掉就行,jQuery会自动用默认的表单编码发送数据,Yii就能正常读到_csrf了:

var durl = "<?php echo Yii::$app->getUrlManager()->getBaseUrl(); ?>/Site/ReqAJAX"; 
$.ajax({ 
    type: "POST", 
    url: durl, 
    data: {_csrf:'<?=\Yii::$app->request->csrfToken?>'}, 
    dataType: "json", 
    // 去掉contentType配置,用默认格式
    success: function(msg) { 
        alert("Success "+msg); 
    }, 
    error: function(err) { 
        alert(JSON.stringify(err)); 
    } 
}); 

办法2:保留JSON格式,通过请求头传CSRF令牌

如果你确实需要用JSON格式发送业务数据,可以把CSRF令牌放到请求头里,Yii也能识别这个头:

var durl = "<?php echo Yii::$app->getUrlManager()->getBaseUrl(); ?>/Site/ReqAJAX"; 
$.ajax({ 
    type: "POST", 
    url: durl, 
    // 注意这里要用JSON.stringify把数据转成JSON字符串
    data: JSON.stringify({/* 这里放你的业务数据 */}), 
    dataType: "json", 
    contentType: "application/json; charset=utf-8", 
    // 把CSRF令牌放到请求头里
    headers: {
        'X-CSRF-Token': '<?=\Yii::$app->request->csrfToken?>'
    },
    success: function(msg) { 
        alert("Success "+msg); 
    }, 
    error: function(err) { 
        alert(JSON.stringify(err)); 
    } 
}); 

额外小建议

生成URL的时候,推荐用Yii自带的Url::to()方法,比手动拼接更靠谱,还能自动处理路由规则:

// 记得先在控制器里引入 use yii\helpers\Url;
var durl = "<?= Url::to(['site/req-ajax']) ?>";

内容的提问来源于stack exchange,提问作者Rahul Baraiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:28:11