原因是
php://input无论内容类型如何,都将在请求的HTTP标头之后返回所有原始数据。
PHP superglobal
$_POST仅 应 包装以下任一数据
application/x-www-form-urlenpred
(用于简单表单发布的标准内容类型)或multipart/form-data
(主要用于文件上传)
这是因为这些是用户代理 _必须_支持的唯一内容类型。因此,服务器和PHP传统上不希望接收任何其他内容类型(这并不意味着它们不能)。
因此,如果您只发布一个好的旧HTML
form,则请求看起来像这样:
POST /page.php HTTP/1.1key1=value1&key2=value2&key3=value3
但是,如果您经常使用Ajax,那么这种可能性还包括使用类型(字符串,整数,布尔值)和结构(数组,对象)交换更复杂的数据,因此在大多数情况下,JSON是最佳选择。但是带有JSON有效负载的请求看起来像这样:
POST /page.php HTTP/1.1{"key1":"value1","key2":"value2","key3":"value3"}现在的内容是
application/json(或至少没有上述内容),因此PHP的
$_POST-wrapper不知道该如何处理。
数据仍然在那里,您只是无法通过包装器访问它。因此,您需要使用
file_get_contents('php://input')(只要未multipart/form-data编码)原始格式来获取它。
这也是您访问XML数据或任何其他非标准内容类型的方式。



