/**
* Returns the JSON encoded POST data, if any, as an object.
*
* @return Object|null
*/
private function retrieveJsonPostData()
{
// get the raw POST data
$rawData = file_get_contents("php://input");
// this returns null if not valid json
return json_decode($rawData);
}
3 回答
原因是
php://input
返回请求的HTTP标头之后的所有原始数据,而不管内容类型如何 .PHP超全局
$_POST
,只应该包装数据application/x-www-form-urlencoded
(简单表格帖子的标准内容类型)或multipart/form-data-encoded
(主要用于文件上传)这是因为这些是must be supported by user agents的唯一内容类型 . 所以服务器和PHP传统上并不意味着他们不能这样做 .
所以,如果您只是发布一个好的旧HTML
form
,请求看起来像这样:但是如果你正在使用Ajax,那么这个probaby还包括用类型(string,int,bool)和结构(数组,对象)交换更复杂的数据,所以在大多数情况下JSON是最好的选择 . 但是带有JSON-payload的请求看起来像这样:
内容现在是
application/json
(或至少没有上述内容),因此PHP的$_POST
-wrapper不知道如何处理(尚未) .数据仍然存在,您无法通过包装器访问它 . 所以你需要使用
file_get_contents('php://input')
(as long as it's not multipart/form-data-encoded)以原始格式自己获取它 .这也是您访问XML数据或任何其他非标准内容类型的方式 .
php://input
可以为您提供数据的原始字节 . 如果POSTed数据是JSON编码结构,这通常是AJAX POST请求的情况,这很有用 .这是一个功能:
当您从传统POST提交的表单处理键值数据时,
$_POST
数组更有用 . 这仅适用于POSTed数据采用可识别格式的情况,通常为application/x-www-form-urlencoded
(有关详细信息,请参阅http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4) .如果发布数据格式错误,$ _POST将不包含任何内容 . 然而,php://输入将具有格式错误的字符串 .
例如,有一些ajax应用程序,它们没有形成正确的后键值序列来上传文件,只是将所有文件转储为发布数据,没有变量名称或任何东西 . $ _POST将为空,$ _FILES也为空,而php://输入将包含精确文件,写为字符串 .