总结:
- 当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded:php://input 中是形同 a=1&b=2的原始数据。$_POST 中是关联数组(常规的post表单提交、ajax默认post提交)
- 提交表单时。 enctype="multipart/form-data" 的时候php://input 是无效的
- $_POST 不能获取 Content-Type = "text/plain"时 post的数据, php://input可以
- 另外:基本上$GLOBALS['HTTP_RAW_POST_DATA'] 和 $_POST是一样的。但是如果post过来的数据不是PHP能够识别的,你可以用 $GLOBALS['HTTP_RAW_POST_DATA'] 或者 $HTTP_RAW_POST_DATA 来接收,比如 text/xml 或者 soap 等等。
$request = file_get_contents('php://input');
$request = $HTTP_RAW_POST_DATA;
$request = $GLOBALS['HTTP_RAW_POST_DATA'];
在$GLOBALS ["HTTP_RAW_POST_DATA"]取不到值的情况下可以按以下方式排查:
1.用file_get_contents('php://input')获取数据。如果获取不到,则可能是数据传输错误,对请求进行捉包,分析数据。
2.如果file_get_contents('php://input')有数据。则查看php.ini配置文件。
找到如下,如果没开启则开启
always_populate_raw_post_data = On
注意:php7已移除这个全局变量$HTTP_RAW_POST_DATA,需要改成
$xml = file_get_contents("php://input");