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: yii.getCsrfToken ()

а также

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

но это не работает

он работает, когда я добавляю это в свой контроллер, но это нехорошо, я не хочу отключать проверку csrf

public $ enableCsrfValidation = false;

Как я могу это исправить?


person Ruben    schedule 31.07.2014    source источник
comment
не следует ли отправлять токен / имя csrf вместе с другими данными сообщения, в вашем случае, с идентификатором, поэтому он просто становится: data: {id: id, csrf_token_name: csrf_token_value}?   -  person Twisted1919    schedule 31.07.2014
comment
Я тоже пробовал, но это не работает   -  person Ruben    schedule 31.07.2014
comment
пока вы отправляете правильное имя и значение csrf в своем почтовом запросе, нет никаких причин, по которым это не сработает, вы делаете что-то не так.   -  person Twisted1919    schedule 31.07.2014
comment
когда я делаю это по-вашему, я получаю еще одно сообщение об ошибке: Not Found (# 404): запрошенная страница не существует.   -  person Ruben    schedule 31.07.2014
comment
если вы получаете 404, это просто означает, что ваш маршрут неверен, указывая на деревья в лесу, а не на действие вашего контроллера. Используйте инструменты разработчика (F12) и посмотрите, что на самом деле происходит в вашем запросе xhr.   -  person Twisted1919    schedule 31.07.2014
comment
проверьте, обновили ли вы свой композитор. следующий только способ _csrf: yii.getCsrfToken () With с вашими данными с включением csrf.   -  person Kshitiz    schedule 31.07.2014
comment
все обновилось, но это не работает, у вас работает?   -  person Ruben    schedule 01.08.2014
comment
Я думаю, вам не нужно добавлять _csrf, потому что в файле cookie уже зарегистрировано значение _csrf, нет?   -  person Ororuk    schedule 05.08.2014
comment
это может показаться глупым, но пробовали ли вы сначала отправить его, а затем идентификатор? данные: {_csrf: yii.getCsrfToken (), 'id': id},   -  person tareq    schedule 06.08.2014
comment
вы добавили ‹? = Html :: csrfMetaTags ()?› и использовали $ thi- ›beginBody (), а затем использовали регистр js для повторного добавления кода js? Также проверьте, как отправлять несколько данных при использовании метода $ .ajax   -  person Kshitiz    schedule 18.09.2014
comment
ваша проблема решена?   -  person Kshitiz    schedule 18.09.2014


Ответы (7)


Вы можете попробовать этот способ. Это работает!

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

  $.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#%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_csrftoken_%D0%B2_ajax_%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81_yii2

person Mirocow    schedule 02.11.2015
comment
Намного лучше, чем предоставлено @ user3534949 stackoverflow.com/questions/25054945/ - person Rostyslav Pylypenko; 24.02.2016
comment
Извините, возможно, в моем комментарии есть двусмысленность. Вы получили от меня +1 за ваш ответ. Мой комментарий означает, что Ваш ответ правильный! Я думаю, нам нужно удалить наши комментарии, потому что они оффтопные. - person Rostyslav Pylypenko; 27.02.2016

Добавьте этот код внизу вашего макета:

<script>
    $.ajaxSetup({
        data: <?= \yii\helpers\Json::encode([
            \yii::$app->request->csrfParam => \yii::$app->request->csrfToken,
        ]) ?>
    });
</script>
person Oleg    schedule 30.03.2015

Это мой код, просто игнорируйте токен 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>');
                }
            }
        });
    });
person Ruben    schedule 02.10.2014
comment
как насчет типа: «ПОЛУЧИТЬ»? - person AHMED.D; 05.10.2015

В моем случае я решил эту проблему, заблокировав csrf-проверку для маршрута «site / save-order» (actionSaveOrder).

class SiteController extends Controller {
    ...
    public function beforeAction($action) {
        $this->enableCsrfValidation = ($action->id !== "save-order"); // <-- here
        return parent::beforeAction($action);
    }
}
person Maksim Tikhonov    schedule 30.11.2014
comment
Не думаю, что это хорошее решение для блокировки csrf-верификации - person Ruben; 01.12.2014
comment
конечно, но когда я пытаюсь отправить ключ проверки csrf на сервер, он, к сожалению, не распознает его ( - person Maksim Tikhonov; 02.12.2014

У меня была такая же проблема, но я заметил, что забыл добавить Html::csrfMetaTags() в раздел заголовка, и это на самом деле исправило это для меня, желаю удачи

person leila    schedule 26.12.2017

Возможно, ваш заголовок AJAX "Content-Type" нужно изменить на "application/x-www-form-urlencoded; charset=UTF-8"

person eric    schedule 12.11.2019