即使我在POST上收到200响应,$ _POST数据仍为空?

时间:2013-09-30 23:58:28

标签: javascript php html angularjs flightphp

我有一个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的处理程序。

2 个答案:

答案 0 :(得分:6)

如果您没有发布表单编码的查询字符串(例如原始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

答案 1 :(得分:2)

好吧,这个有点时髦。但由于FlightPHP, 。通常,Mike Brant提供的答案将是100%正确的!但是,FlightPHP在我可以之前读取该输入,并且根据PHP文档,只能读取一次

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

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

Flight::request()->body返回JSON字符串。但那时需要解码并变成一个关联数组,这就是我将true作为第二个参数传递的原因。