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
相关产品推荐
相关产品推荐

