服务热线
1888888888
作者:文煞发布时间:2023-09-17分类:站长笔记浏览:404
今天我想解释一下 $_POST、file_get_contents("php://input") 和 $GLOBALS['HTTP_RAW_POST_DATA'] 这三种用来接收 POST 请求的方法。虽然它们都用于接收 POST 请求,但很少有人能清楚地说明它们之间的区别,接下来我会详细解释一下。
一、$_POST['paramName']
$_POST 只能接收 Content-Type 为 application/x-www-form-urlencoded 的数据。PHP 会将 HTTP 请求体中的数据填充到 $_POST 数组中,并对填充的数据进行 urldecode() 解析。(实际上,除了这种 Content-Type,还有一种是 multipart/form-data,表示数据是表单数据)
二、file_get_contents("php://input")
file_get_contents("php://input") 适用于大多数 Content-Type 类型。php://input 允许读取原始 POST 数据。相比于 $HTTP_RAW_POST_DATA,它对内存的压力较小,而且不需要特殊的 php.ini 设置。然而,php://input 不能用于 enctype="multipart/form-data"。
三、$GLOBALS['HTTP_RAW_POST_DATA']
$HTTP_RAW_POST_DATA 总是包含原始的 POST 数据。这个变量只有在遇到未识别的 MIME 类型数据时才会产生。对于 enctype="multipart/form-data" 格式的表单数据,$HTTP_RAW_POST_DATA 是不可用的。需要特别注意的是,这种方式在低版本的 PHP 中使用,并且需要 php.ini 中设置 always_populate_raw_post_data 为 On,但在 PHP 7 及之后的版本中已被废弃。
综上所述:
1. 只有当 Content-Type 为 application/x-www-data-urlencoded 和 multipart/form-data 时,PHP 才会将相应的 HTTP 请求数据填充到全局变量 $_POST 中。
2. 当 PHP 无法识别 Content-Type 类型时,它会将相应的 HTTP 请求数据填充到变量 $HTTP_RAW_POST_DATA 中。
3. 只有 Content-Type 不为 multipart/form-data 时,PHP 才不会将 HTTP 请求数据填充到 php://input,否则其他情况都会填充。填充的数据长度由 Content-Length 指定。
4. 只有当 Content-Type 为 application/x-www-form-urlencoded 时,php://input 中的数据才与 $_POST 中的数据一致。
5. php://input 中的数据始终与 $HTTP_RAW_POST_DATA 相同,但 php://input 更高效,且不需要特殊的 php.ini 设置。
6. 对于 GET 方法提交的 HTTP 请求,PHP 会将 PATH 字段中的 query_path 部分填充到全局变量 $_GET 中,通常情况下,GET 方法提交的 HTTP 请求体为空。
综上所述:
1. 如果你的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data,使用 $_POST。
2. 如果无法获取数据,例如 text/xml、application/json、soap 等,使用 file_get_contents("php://input")。
希望通过这些解释,你现在能更清楚地理解为什么在与第三方平台进行接口对接时,经常使用 file_get_contents("php://input") 这种方式。
本文由AI辅助创作完成!
由于部分虚拟主机用户建设违法网页,导致原IP被封禁,请及时解析域名到新的IP地址:45.15.10.56!同时遵守我国法律法规,并保留将相关传播违法信息者的联系信息提供给警方的权利!
分享:
支付宝
微信