我有一个PHP应用程序,它使用AngularJS作为客户端,FlightPHP用于REST服务,
PHP用于后端。但是,即使我在这里使用此代码发出POST
:
$scope.registerUser = function() {
$http({
method: 'POST',
url: '/user/register',
data: $scope.user
}).success(function(data) {
if (data.result === undefined) {
setAjaxMessage(data, false);
return;
}
if (data.result === 0) {
setAjaxMessage(data.message, true);
}
else {
setAjaxMessage(data.message, false);
}
}).error(function(data) {
setAjaxMessage(data, false);
});
};
我通过 Firefox 收到一条成功的POST
消息,Params -> Request payload
选项卡设置为以下数据:
{"displayname":"user1","email":"user1@gmail.com","password":"abc123"}
当我发出这个服务器端时:
Flight::route('POST /user/register', function() {
echo var_dump($_POST);
return;
// register the user
require 'core/register.php';
});
我明白这个:
array (size=0)
empty
这里给了什么?我以前从未遇到过$_POST
数据的问题。我有一种感觉,它与FlightPHP有关,但我不能把手指放在上面。如您所见,它正在进入POST
的处理程序。
如果您不发布表单编码的查询字符串(就像原始 JSON 的情况一样),则需要从 PHP 的原始输入中获取数据。 以下是将 JSON 数据读入适当的 PHP 数据结构的方法:
$post_data = json_decode(file_get_contents('php://input'));
还应显式设置内容类型标头,如下所示:
$http({
method: 'POST',
url: '/user/register',
data: $scope.user,
headers: {'Content-Type': 'application/json'}
}).success(function(data) {
// rest of your code
好吧,这个有点时髦。但这是因为FlightPHP。通常,迈克布兰特提供的答案将是 100% 正确的!但是,FlightPHP 在我之前读取该输入,根据 PHP 文档,它只能读取一次。
那么,FlightPHP把它放在哪里呢?哈,现在这很奇怪。他们把它放在一个名为 body
的属性中,所以我必须这样做来获取这些 JSON 值:
$vars = json_decode(Flight::request()->body, true);
Flight::request()->body
返回 JSON 字符串。但是这需要解码并转换为关联数组,因此这就是我将true
作为第二个参数传递的原因。