全方位站长技能、SEO优化学习平台
当前位置:网站首页 > 站长笔记 > 正文

$_POST和file_get_contents(“php://input”)的有什么区别

作者:admin发布时间:2023-09-17分类:站长笔记浏览:329


温馨提示:手机扫码可阅读当前文章!
文章简介:今天我想解释一下 $_POST、file_get_contents("php://input") 和 $GLOBALS['HTTP_RAW_POST_DATA'] 这三种用来接收 POST 请求的方法。虽...

今天我想解释一下 $_POST、file_get_contents("php://input") 和 $GLOBALS['HTTP_RAW_POST_DATA'] 这三种用来接收 POST 请求的方法。虽然它们都用于接收 POST 请求,但很少有人能清楚地说明它们之间的区别,接下来我会详细解释一下。


$_POST和file_get_contents(“php://input”)的有什么区别  第1张

一、$_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:3.128.204.5,您的网络:Amazon_EC2服务器


服务热线

1888888888

要发发发发发发

站长微信公众号

站长微信公众号

分享:

支付宝

微信