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);
});
});
我有我的 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);
});
});