Yii2 ajax错误请求(#400)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii2 ajax错误请求(#400)相关的知识,希望对你有一定的参考价值。

当我使用此代码时,我将此错误作为响应:

错误请求(#400):无法验证您的数据

/**
 * Active toggle
 */
$(document).on('click', '[data-toggle-active-menu-items]', function(e){

    e.preventDefault();

    var id = $(this).data('toggle-active-menu-items');

    $.ajax({
        url: 'active',
        type: 'POST',
        data: {'id': id, _csrf: yii.getCsrfToken()}, 
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(data) {
            if (data.active == 1)
            {
                $('#list-' + id + ' [data-toggle-active-menu-items]').html('<span class="glyphicon glyphicon-eye-open"></span>');
            } else {
                $('#list-' + id + ' [data-toggle-active-menu-items]').html('<span class="glyphicon glyphicon-eye-close"></span>');
            }
        }
    });
});

我尝试添加

_csrf:na.getCsrfToken()

contentType:“application / json; charset = utf-8”, dataType:“json”,

但那不起作用

当我将它添加到我的控制器时,它确实有效,但这不好,我不想禁用csrf验证

public $ enableCsrfValidation = false;

我怎样才能解决这个问题?

答案

你可以试试这种方式。这是工作!

var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
         url: 'request',
         type: 'post',
         dataType: 'json',
         data: {param1: param1, _csrf : csrfToken},
});
另一答案
  $.ajax({
    url: '$urlSave',
    type: 'post',
    data: {payload: payload, _csrf: yii.getCsrfToken()},        
    dataType: 'json',
  }).success(function(response) {
  });

其他例子:http://docs.mirocow.com/doku.php?id=yii2:docs#добавление_csrftoken_в_ajax_запрос_yii2

另一答案

现在这是我的代码,只需忽略csrf标记:

$(document).on('click', '[data-toggle-active-menu-items]', function(e){

        e.preventDefault();

        var id = $(this).data('toggle-active-menu-items');

        $.ajax({
            url: 'active',
            type: 'POST',
            data: {'id': id},
            dataType: "json",
            success: function(data) {
                if (data.active == 1)
                {
                    $('#list-' + id + ' [data-toggle-active-menu-items]').html('<span class="glyphicon glyphicon-eye-open"></span>');
                } else {
                    $('#list-' + id + ' [data-toggle-active-menu-items]').html('<span class="glyphicon glyphicon-eye-close"></span>');
                }
            }
        });
    });
另一答案

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

<script>
    $.ajaxSetup({
        data: <?= yiihelpersJson::encode([
            yii::$app->request->csrfParam => yii::$app->request->csrfToken,
        ]) ?>
    });
</script>
另一答案

在我的情况下,我通过阻止“site / save-order”路由(actionSaveOrder)的csrf验证解决了这个问题。

class SiteController extends Controller {
    ...
    public function beforeAction($action) {
        $this->enableCsrfValidation = ($action->id !== "save-order"); // <-- here
        return parent::beforeAction($action);
    }
}
另一答案

我有同样的问题,但我注意到我忘了在头部添加Html::csrfMetaTags(),并实际上修复它为我好运

以上是关于Yii2 ajax错误请求(#400)的主要内容,如果未能解决你的问题,请参考以下文章

ajax在wordpress中发送400错误请求错误

在 Jquery Ajax POST 中获取 400 错误请求错误

AJAX POST 上的 JSON Stringify 400 错误请求

Wordpress:在没有插件的情况下集成 Mailchimp 错误请求 400 Ajax URL

尝试从 ajax(Wordpress 插件)将 FormData 中的 Blob 发布到 php 时出现 400(错误请求)

Wordpress、管理菜单、Ajax 400 错误请求