javascript - Yii框架2.0使用POST方法的AJAX请求

标签 javascript php ajax post yii2

在一个域上,我的 Yii 2.0 Web 应用程序在 Controller 中具有处理 POST 请求的方法。下面是我的 Controller 类中的代码。

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'rules' => [
                [
                    'actions' => [
                        'my-method',
                    ],
                    'allow' => true,
                ],
            ],
        ],
         'verbs' => [
             'class' => VerbFilter::className(),
             'actions' => [
                 'my-method' => ['post'],
             ],
         ],
    ];
}

public function actionMyMethod()
{
    Yii::$app->controller->enableCsrfValidation = false;

    $response = Yii::$app->response;
    $response->format = \yii\web\Response::FORMAT_XML;

    return ['msg' => 'OK!'];
}

在另一个域上,我有一个简单的页面(不是 Yii 2.0 应用程序),它使用纯 JavaScript 通过 POST 方法发送 AJAX 请求。下面是代码。

var xmlhttp;
if (window.XMLHttpRequest) {
     xmlhttp = new XMLHttpRequest();
} else {
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("POST", "http://my-domain.com/controller-name/my-method", true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("id=Henry");
xmlhttp.onreadystatechange = function() {
     if (xmlhttp.readyState==4 && xmlhttp.status==200) {
          var responseXml = xmlhttp.responseXML;
          txt=" ";
          x=responseXml.getElementsByTagName("msg");
          for (i=0;i<x.length;i++) {
               txt = txt + x[i].childNodes[0].nodeValue;
          }
          alert(txt);
     }
}

每次我尝试运行上面的 JavaScript 代码时,它都会在控制台中显示 POST 400(错误请求)。如果我从 POST 更改为 GET,效果很好。有人可以告诉我我错过了什么吗?上面的代码有什么问题?

最佳答案

如果您想禁用单个操作的 CSRF 验证,您需要在 beforeAction 事件处理程序中执行此操作,因为在操作运行之前会检查 CSRF token (在 beforeAction 中) yii\web\Controller)。

/**
 * @inheritdoc
 */
public function beforeAction($action)
{            
    if ($action == 'my-method') {
        Yii::$app->controller->enableCsrfValidation = false;
    }

    return parent::beforeAction($action);
}

官方文档:

This answer是相关的,但我在那里没有提到这些细节,也更新了。

关于javascript - Yii框架2.0使用POST方法的AJAX请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30501893/

相关文章:

javascript - 如何识别大型数组中的重复项?

php - 如何将带有HTML实体和无效字符的文本转换为其等效的UTF-8?

php - 奇怪的编码问题

php - Symfony2 : trouble including images in css

mysql - Laravel 的 View 的 ajax 命名路由

javascript - 定义 jQuery Ajax 方法($.get、$.post、$.ajax、$.getScript 等)基本方法

php - css 下拉菜单不适用于 iphone/ipad

javascript - 获取由 Three.js 中的displacementMap 置换的修改后的网格

JQuery 显示属性不起作用 - prestashop

javascript - 保持对象顺序