即使我在 POST 上收到 200 响应,$_POST 数据还是空的?

Posted

技术标签:

【中文标题】即使我在 POST 上收到 200 响应,$_POST 数据还是空的?【英文标题】:The $_POST data is empty even though I'm getting a 200 response on the POST? 【发布时间】:2013-10-06 23:59:48 【问题描述】:

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

【问题讨论】:

您看到var_dump 的确切输出是什么? PS:var_dump自己输出,前面不需要额外的echo @zerkms,抱歉我在编辑时弄乱了帖子。请查看我的编辑。 如果您在该框架的入口点作为第一行执行var_dump($_POST); 会怎样?在框架有机会放弃它之前。 @zerkms,结果完全相同。 您不会碰巧发送 JSON 而不是 url 编码的键值对吗? 【参考方案1】:

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

【讨论】:

这对我有用!编码 php 13 年,这是我第一次遇到这个。谢谢! 数据发送成功,但$_POST为空时。我确认相反, json_decode(file_get_contents('php://input')) 就像一个魅力。所以谢谢!【参考方案2】:

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

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

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

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

【讨论】:

谢谢你!我被同样的问题困住了,几乎放弃了。 @izolate,很高兴能为您提供帮助! "根据 PHP 文档只能阅读一次",你有参考吗?我也对这个问题感到困惑。谢谢!

以上是关于即使我在 POST 上收到 200 响应,$_POST 数据还是空的?的主要内容,如果未能解决你的问题,请参考以下文章

Http 请求 GET和POST的区别

AWS CORS 问题:即使在获得 200 状态代码后,Ajax 响应也会出现错误

跨域 ajax POST 到 web-api 总是返回空响应

得到 200 响应,还有 CORS 错误?

Flutter - 在得到预期的 200 之前总是得到错误的 POST 400 响应

POST 请求的 HTTP 状态码 202 与 200