2

我有一个 PHP 应用程序,客户端使用AngularJS ,REST 服务使用FlightPHP ,后端使用 PHP。

但是,即使我在POST这里使用此代码发出 a :

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

POST通过 Firefox 收到一条成功的消息,标签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如您所见,它正在进入处理程序。

4

2 回答 2

7

如果您没有发布表单编码的查询字符串(如原始 JSON 的情况),则需要从 PHP 的原始输入中获​​取数据。以下是如何将 JSON 数据读入适当的 PHP 数据结构:

$post_data = json_decode(file_get_contents('php://input'));

您还应该显式设置 Content-type 标头,如下所示:

$http({
    method: 'POST',
    url: '/user/register',
    data: $scope.user,
    headers: {'Content-Type': 'application/json'}
}).success(function(data) {
  // rest of your code
于 2013-10-01T00:13:48.343 回答
2

好吧,这个有点时髦。但这因为 FlightPHP。通常,Mike Brant 提供的答案是 100% 正确的!但是,FlightPHP 会先读取该输入,并且根据 PHP 文档,它只能读取一次

那么,FlightPHP 把它放在了哪里呢?哈,现在这很奇怪。他们把它放在一个名为 的属性中body,所以我必须这样做来获取这些 JSON 值:

$vars = json_decode(Flight::request()->body, true);

Flight::request()->body返回 JSON 字符串。但随后需要解码并转换为关联数组,这就是为什么我将 传递true为第二个参数。

于 2013-10-01T00:18:26.150 回答