我被指示使用该方法,php://input而不是$_POST与JQuery的Ajax请求进行交互时使用。我不了解使用vs $_POST或全局方法的好处$_GET。
php://input
$_POST
$_GET
原因是php://input无论内容类型如何,都将在请求的HTTP标头之后返回所有原始数据。
PHP superglobal $_POST仅 应 包装以下任一数据
application/x-www-form-urlencoded
multipart/form-data
这是因为这些是用户代理 必须 支持的唯一内容类型。因此,服务器和PHP传统上不希望接收任何其他内容类型(这并不意味着它们不能)。
因此,如果您只发布一个好的旧HTML form,则请求看起来像这样:
form
POST /page.php HTTP/1.1 key1=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不知道该如何处理。
application/json
数据仍然在那里,您只是无法通过包装器访问它。因此,您需要使用file_get_contents('php://input')(只要未multipart/form- data编码)原始格式来获取它。
file_get_contents('php://input')
multipart/form- data
这也是您访问XML数据或任何其他非标准内容类型的方式。