【问题标题】:yii2 server function returns empty result on request from my Angular controlleryii2 服务器函数根据我的 Angular 控制器的请求返回空结果
【发布时间】:2015-05-16 10:46:43
【问题描述】:

我有我的 Angular $http.post 请求。服务器以 JSON 格式返回响应。根据yii2-cookbook

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

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

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);
});

【问题讨论】:

  • 我在本地测试过,效果很好。您可以发布完整的控制器代码吗?那里一定有什么东西干扰了正常行为。

标签: php json angularjs yii2 yii2-advanced-app


【解决方案1】:

实际上你的代码应该可以工作:

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 中的发布请求发送 CSRF 令牌。因此,您需要将其添加到请求标头中。这是 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);
    });          
});

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多