yii2 服务器函数 returns 根据我的 Angular 控制器请求的空结果

yii2 server function returns empty result on request from my Angular controller

我有我的 Angular $http.post 请求。服务器 return 的响应采用 JSON 格式。根据yii2-cookbook:

public function actionIndex() {
   \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $id = 2015;
    return $id;
}

但是这个函数没有return任何东西:

Content-Length:0
Content-Type:application/json; charset=UTF-8

再举一个例子:

public function actionIndex() {
   \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    $id = 2015;
    echo $id; // echo instead of return
}

现在有一些数据响应:

Content-Length:4
Content-Type:application/json; charset=UTF-8

为什么带有 return 语句的第一个示例可能不起作用?

我在 UI 上的控制器:

var request = $http({
    method: 'post',
    url: '/resume/save',
    headers: {
        'Content-Type': 'application/json'
    },
    data: {
        myData: $scope.myData
    }
});
request.success(function(id) {
    console.log(id);
});

实际上您的代码应该有效:

public function actionIndex() {
    Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;    
    $id = 2015;    
    return $id;
}

我用 jQuery ajax 请求测试过:

<?= Html::a('asd', '/', ['class'=>'asd']); ?>
<?php $this->registerJs("$('a.asd').click(function(e) {
    e.preventDefault();
    console.log(e);
    $.ajax({
        url: '/catalog/index',
        data: data,
        success: function (data) {
            console.log(data);
        },
        dataType: 'json'
    });
})");

并在控制台中得到正确的响应。

此外,请注意,您必须在 Yii2 中为 post 请求发送 CSRF 令牌。因此,您需要将其添加到请求 headers。这是 Angular 1.4 的示例:

var app = angular.module('app', []);

app.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.defaults.headers.post['X-CSRF-Token'] = $('meta[name="csrf-token"]').attr("content");
    $httpProvider.defaults.headers.common['Accept'] = 'application/json, text/javascript';
    $httpProvider.defaults.headers.common['Content-Type'] = 'application/json; charset=utf-8';
}]);   

app.controller('MyCtrl', function ($scope, $http) {            
    var request = $http({
        method: 'post',
        url: '/data/test',
        headers: {
            'Content-Type': 'application/json'
        },
        data: {
            myData : $scope.myData
        }
    });    
    request.success(function (id) {
        console.log(id);
    });          
});