在Yii 2中发送AJAX发布请求后400 Bad Request

时间:2016-01-15 02:41:55

标签: php ajax yii2

我想通过ajax将数据发布到某个特定的控制器,如下所示:

<script>
    var myUrl = "<?php echo Url::to(['table/edit']); ?>";
</script>
$.ajax({
            type : "POST",
            url : myUrl,
            data: {id: userID},
            success  : function(response) {
                alert("Table is editted");
            }
        });

在控制器中我希望得到这些发布的数据并做其他事情。 但是当我尝试这个时,我收到错误“400(错误请求)”。 如果有人可以帮助它会很棒!谢谢!

2 个答案:

答案 0 :(得分:1)

yii\web\BadRequestException(表示代码为400的HTTP错误)可能会在以下情况下抛出:

1) 无法验证您的数据提交。 CSRF验证已启用且失败。我不认为这是你的理由,因为它默认启用并包含在meta标签中。使用jQuery时,您不必手动发送它。

2) 缺少必需的参数。

如果您的参数没有默认值,例如:

public function actionTest($someParam)
{
    ...
}

如果您没有通过someParam,则会抛出异常。

3) 请求正文中的JSON数据无效。

如果您将JSON作为参数发送,并且它不是有效的JSON。

4) 参数收到的数据无效。在绑定参数到操作期间抛出:

if ($param->isArray()) {
    $args[] = $actionParams[$name] = (array) $params[$name];
} elseif (!is_array($params[$name])) {
    $args[] = $actionParams[$name] = $params[$name];
} else {
    throw new BadRequestHttpException(Yii::t('yii', 'Invalid data received for parameter "{param}".', [
        'param' => $name,
    ]));
}

最后两个很少见面,尤其是最后一个(当我遇到它时,甚至不记得单次)。

这些应该是目前所有可能的情况,我通过消息来源进行全球搜索只是为了确保。

答案 1 :(得分:1)

只需添加csrf,如:

       <script>
         var myUrl = "<?php echo Url::to(['table/edit']); ?>";        
       </script>
       $.ajax({
            type : "POST",
            url : myUrl,
            data: {id: userID,_csrf:'<?=\Yii::$app->request->csrfToken?>'},
            success  : function(response) {
                alert("Table is editted");
            }
        });