天天看点

PHP——$_POST、$HTTP_RAW_POST_DATA和php://input的区别

  在进行数据传输和数据交互时,经常需要获取他人传输来的数据,这时一般会有三种方法提供给我们来进行数据的获取,现在来简单介绍一下这三种方法的区别。

1.$_post

  这是我们在数据交互时常用的一种方法,但对于接收json格式的数据而言显然是行不通的,具体原因在于post是以关联数组方式组织提交的数据,并对此进行编码处理,如urldecode,甚至编码转换,识别的数据类型是PHP默认识别的数据类型application/x-www.form-urlencoded和multipart/form-data,无法解析如text/xml,application/json等非application/x-www.form-urlencoded 数据类型的内容。

2.$HTTP_RAW_POST_DATA

  PHP默认识别的数据类型是application/x-www.form-urlencoded,当Content-Type=application/json类型时无法通过 $_POST获取,但是使用 GLOBALS[‘HTTP_RAW_POST_DATA’]可以获取到。因为在PHP无法识别Content-Type的时候,就会把 POST 数据填入HTTP_RAW_POST_DATA 中。但这种方法需要设置 php.ini 中的 always_populate_raw_post_data 值为 On 才会生效,且当POST 与php://input可以取到值时 $HTTP_RAW_POST_DATA 为空,当enctype="multipart/form-data"时也无法使用。注意:PHP7中已经移除了这个全局变量,用 php://input 替代

3.php://input

  只有在Coentent-Type为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会。填入的长度,由Coentent-Length指定。且只有Content-Type为application/x-www-data-urlencoded时,php://input数据才跟$_POST数据相一致(格式不一致,内容一致)。

举个例子说明一下。

<?php
var_dump(http_build_query($_POST));
var_dump(file_get_contents("php://input"));
var_dump($HTTP_RAW_POST_DATA);
?>
<form method="post">
年龄:<input name="age" type="text" />
<input name="submit" type="submit" />
</form>
           

输入24之后的结果为:

PHP——$_POST、$HTTP_RAW_POST_DATA和php://input的区别

从例一我们可以得出以下结论:

1、通常情况下,http_build_query($_POST) =  file_get_contents("php://input"),但是Content-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST,而如果客户端向服务器post的数据是xml等格式时,$_POST是接收不了的,这种情况下只能用php://input或者是$HTTP_RAW_POST_DATA来接收。

2、$HTTP_RAW_POST_DATA依赖于php.ini文件中对于always_populate_raw_post_data参数的配置,如例一所示,在该参数设置为off的情况下,$HTTP_RAW_POST_DATA为null,其次,$HTTP_RAW_POST_DATA已在php5.6版本中废弃,官方建议使用php://input替代$HTTP_RAW_POST_DATA。使用php://input比激活 always_populate_raw_post_data 潜在需要更少的内存。

<?php
var_dump(http_build_query($_POST));
var_dump(file_get_contents("php://input"));
var_dump($HTTP_RAW_POST_DATA);
?>
<form method="post" enctype="multipart/form-data">
年龄:<input name="age" type="text" />
<input name="submit" type="submit" />
           

输入24之后的结果为:

PHP——$_POST、$HTTP_RAW_POST_DATA和php://input的区别

可以看出,当enctype="multipart/form-data" 的时候 php://input 是无效的。

Tips:关于enctype=multipart/form-data的意义,就是将该次http请求头部(head)中的Content-Type设置为multipart/form-data。multipart/form-data也表示以POST方法提交表单数据,它还伴随了文件上传,所以会跟application/x-www-form-urlencoded数据格式不一样。它会以一更种更合理的,更高效的数据格式传递给服务端。

本文参考文章链接:https://blog.csdn.net/huangjingwen1129/article/details/82858573

https://blog.csdn.net/u011250882/article/details/47188883