使用Yii 2对Ajax调用获取错误请求(#400)

这是我的代码:

$(document).on('change', '#tblhotel-int_zone_id', function(e){ var zoneId = $(this).val(); var form_data = { zone: zoneId }; $.ajax({ url: "state", type: "POST", data: form_data, success: function(response) { alert(response); } }); }); 

由此可见:

错误请求(#400):无法validation您的数据提交。

我已经有 。 我该如何解决这个问题?

你有enableCsrfValidation的问题。 要了解更多信息,请阅读此处 。

要禁用CSRF,请将此代码添加到控制器:

 public function beforeAction($action) { $this->enableCsrfValidation = false; return parent::beforeAction($action); } 

这将禁用所有操作。 根据$动作,您可能应该仅针对特定操作禁用它。

注意:请参阅Skullcrasher的答案,以更恰当的方式执行此操作。

正如Mihai P.所说,你的问题是CSRFvalidation。 您也可以禁用行为validation,但这不是一个好的解决方案。

由于您在使用validation的Ajax请求中遇到问题,您还可以使用Yii JavaScript函数将CSRF令牌添加到您在Ajax请求中发送的formdata。

只需尝试将令牌添加到表单数据中,如下所示:

 var form_data = { zone: zoneId, _csrf: yii.getCsrfToken() }; 

我希望这有帮助,因此您不必禁用CSRFvalidation。

除了手动添加CSRF令牌之外,您还可以检查请求中是否设置了X-CSRF头。

在布局的底部添加此代码:

  

使用:

 var csrfToken = $('meta[name="csrf-token"]').attr("content"); $.ajax({ url: 'request', type: 'post', dataType: 'json', data: {param1: param1, _csrf : csrfToken}, }); 

更多细节: Yii2:使用csrf令牌

您需要在before action函数中禁用CSRFvalidation:

 public function beforeAction($action) { if($action->id == "action name need to disable") $this->enableCsrfValidation = false; return parent::beforeAction($action); } 

或者使用GET方法 。

这很有效。 在Config / main.php中使用您自己的csrfParam更改

 'components' => [ 'request'=>[ 'csrfParam'=>"othername" ], ... 

请记住,您必须在请求中包含与您在config中定义的名称相同的令牌。

/backend/config/main-local.php

 'components' => [ 'request' => [ 'cookieValidationKey' => 'unique code', 'csrfCookie' => ['httpOnly' => true, 'path' => '/admin/'], ], ], 

/frontend/config/main-local.php

 'components' => [ 'request' => [ 'cookieValidationKey' => 'unique code', 'csrfCookie' => ['httpOnly' => true, 'path' => '/'], ], ],