如何使用PHP接收和处理非浏览器POST数据的三种有效方法

一般来说,用户会通过浏览器网页表单向服务器进行 post 提交数据。我们利用 PHP 来接收用户 post 到服务器的数据,并且对其进行恰当的处理。然而,在某些情况下,例如用户使用客户端软件向服务端的 php 程序发送 post 数据时,就不能用 $_POST 来进行识别。那么,这种情况下又该如何处理呢?
三种方式 $_POST方式接收数据
HTTP POST 方法传递的变量组成了一个数组,这种通过 HTTP POST 方法传递变量组成的数组就是 $_POST 方式,并且它是自动全局变量。使用$_POST['name']能够接收到网页表单以及网页异步方式post过来的数据,这意味着$_POST仅能接收文档类型为Content-Type: application/x-www-form-urlencoded所提交的数据。
使用 $GLOBALS['HTTP_RAW_POST_DATA']这种方式来接收数据。
如果所使用 post 过来的数据不属于 PHP 能够识别的文档类型,例如 text/xml 或者 soap 等这类,那么我们能够借助$GLOBALS['HTTP_RAW_POST_DATA']来进行接收。并且$HTTP_RAW_POST_DATA 这个变量中包含着原始的 POST 数据。此变量仅在遇到未识别的 MIME 类型数据时才会产生。$HTTP_RAW_POST_DATA 对于 enctype="multipart/form-data" 的表单数据是不可用的。这意味着利用$HTTP_RAW_POST_DATA 不能够接收网页表单 post 过来的数据。
php://input方式接收数据
访问原始 POST 数据的更好方法是 php://input 。php://input 能够读取 POST 的原始数据 。它与 $HTTP_RAW_POST_DATA 相比,给内存带来的压力较小。同时,它不需要任何特殊的 php.ini 设置。而 php://input 无法用于 enctype="multipart/form-data"。
用户将一个文件 post 给服务器,此文件的内容我们无需知晓,然而我们需将该文件完整地保存在服务器上,可使用如下代码:
$input = file_get_contents('php://input');
file_put_contents($original, $input); //$original为服务器上的文件
以上代码通过 file_get_contents('php://input') 来接收 post 数据,接着把数据写入到 $original 文件里。这可以被理解为从客户端向服务器上传了一个文件。此类应用有很多,尤其在我们进行 PHP 开发并与 C、C++等应用程序开发进行产品联合开发时会用到。
代码
- 演示了 php://input 的接收及处理。
a.html
<form name="demo_form" action="post.php" method="post">
<p><label>Name: label><input type="text" class="input" name="name">p>
<p><label>Address: label><input type="text" class="input" name="address">p>
<p><input type="submit" name="submit" class="btn" value="Submit">p>
form>
post.php
header(Content-type 为 text/html 且字符集为 utf-8 。);
echo '$_POST接收:
';
print_r($_POST);
echo '
';
echo $GLOBALS['HTTP_RAW_POST_DATA']接收了内容。
';
print_r($GLOBALS['HTTP_RAW_POST_DATA']);
echo '
';
echo 'php://input接收:
';
$data = file_get_contents('php://input');
print_r(urldecode($data));
echo '$_GET接收:
';
print_r($_GET);
echo '
';
参考