【问题标题】:Reading non key/value POST data from PHP从 PHP 读取非键/值 POST 数据
【发布时间】:2014-09-18 07:25:17
【问题描述】:

我有一个系统将数据发布到 URL 而不发送键/值对,而是使用 XML 有效负载。我需要在 Apache 下使用 PHP 读取 XML 数据,但 PHP 的 $_POST 数组用于键/值对,因此是空白的,因为没有提供键。

我尝试从php://inputphp://stdin 读取,但这也是空白。

如何使用 PHP 读取原始 POST 数据?我无法控制输入,因为它是由第三方应用程序生成的。想象这是一个接受 XML 负载的 RESTful URL。

【问题讨论】:

  • 你如何发送 xml 数据?
  • @RakeshSharma 它是由第三方应用程序发送的。想象一下使用 CURL:$data = 'foo'; curl_setopt_array($ch, array(CURLOPT_POSTFIELDS => $data, CURLOPT_POST => TRUE));
  • 您能否确认第三方应该发送的数据实际上正在发送(即您确定您确实收到了数据)?
  • 我确定它正在发送数据。
  • 这两个选项中的哪一个为您解决了问题?

标签: php apache http post


【解决方案1】:

根据 PHP 手册,php://input is not available with enctype="multipart/form-data".。如果这是发布给您的内容,PHP 将不允许您访问原始数据。 解决此问题的一种方法:
来源:https://stackoverflow.com/questions/1361673/get-raw-post-data

将此添加到您的 apache.conf:

<Location "/backend/XXX.php">
        SetEnvIf Content-Type ^(multipart/form-data)(.*) MULTIPART_CTYPE=$1$2
        RequestHeader set Content-Type application/x-httpd-php env=MULTIPART_CTYPE
        RequestHeader set X-Real-Content-Type %{MULTIPART_CTYPE}e env=MULTIPART_CTYPE
</Location>

从 PHP 5.4 开始,还有“enable-post-data-reading” ini 设置 (http://php.net/manual/en/ini.core.php#ini.enable-post-data-reading)。

来自 PHP 手册:“禁用此选项会导致 $_POST 和 $_FILES 不会被填充。读取 postdata 的唯一方法是通过 php://input 流包装器。这对于代理请求或以内存高效的方式处理 POST 数据。”

尝试禁用此设置,然后从php://input 读取。

【讨论】:

    【解决方案2】:

    您可以通过以下方式检查您的帖子中是否存储了任何信息:

    print_r( $_POST );
    

    您想要做的可能是在名为 xml 的键中发送 XML 数据,或者类似的导致 $_POST['xml'] = 'your xml code'

    编辑:

    如果您能发布用于创建$_POST 的代码,那就太好了。

    【讨论】:

    • POST 是由我无法控制的第三方应用程序发送的,因此我无法发送键/值对。想象这是一个带有 XML 有效负载的 RESTful URL。
    • 您是否从包含您的数据的 print_r( $_POST ) 或 print_r( $_GET ) 获得任何结果?
    • 它们是空白数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2014-04-18
    • 2012-04-16
    • 2017-05-01
    • 2019-04-19
    相关资源
    最近更新 更多