在与来自 JQuery 的 Ajax 请求交互时,我被指示使用方法 php://input
而不是 $_POST
。我不明白的是使用这个与 $_POST
或 $_GET
的全局方法相比的好处。
最佳答案
原因是 php://input
返回请求的 HTTP-headers 之后的所有原始数据,无论内容类型如何。
PHP 超全局$_POST
,只有应该包装数据,要么是
application/x-www-form-urlencoded
(简单表单帖子的标准内容类型)或multipart/form-data
(多用于文件上传)
这是因为只有这些内容类型 must be supported by user agents .所以服务器和 PHP 传统上不期望接收任何其他内容类型(这并不意味着它们不能)。
所以,如果你只是简单地 POST 一个好的旧 HTML form
,请求看起来像这样:
POST /page.php HTTP/1.1
key1=value1&key2=value2&key3=value3
但如果您经常使用 Ajax,这可能还包括使用类型(字符串、int、bool)和结构(数组、对象)交换更复杂的数据,因此在大多数情况下 JSON 是最佳选择。但是带有 JSON 有效负载的请求看起来像这样:
POST /page.php HTTP/1.1
{"key1":"value1","key2":"value2","key3":"value3"}
内容现在将是 application/json
(或者至少不是上面提到的),所以 PHP 的 $_POST
-wrapper 不知道如何处理它(然而)。
数据仍然存在,只是无法通过包装器访问它。因此,您需要使用 file_get_contents('php://input')
( as long as it's not multipart/form-data
-encoded ) 以原始格式自己获取它。
这也是您访问 XML 数据或任何其他非标准内容类型的方式。
关于PHP "php://input"与 $_POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8893574/