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",
тип данных: "json",
но это не работает
он работает, когда я добавляю это в мой контроллер, но это не хорошо, я не хочу отключать проверку csrf
public $enableCsrfValidation = false;
Как я могу это исправить?
6 ответов
вы можете попробовать этот способ. Это работа!
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: <?= \yii\helpers\Json::encode([
\yii::$app->request->csrfParam => \yii::$app->request->csrfToken,
]) ?>
});
</script>
в моем случае я решил эту проблему с блокировкой csrf-проверки для маршрута" site/save-order " (actionSaveOrder).
class SiteController extends Controller {
...
public function beforeAction($action) {
$this->enableCsrfValidation = ($action->id !== "save-order"); // <-- here
return parent::beforeAction($action);
}
}
У меня была такая же проблема
но я заметил, что забыл добавить Html::csrfMetaTags()
в головном разделе, и это фактически исправило его для меня
удачи