PHP“php://input”vs $ _POST
在与来自JQuery的Ajax请求进行交互时,我被指示使用php://input
而不是$_POST
。 我不明白的是使用这个比$_POST
或$_GET
的全局方法的好处。
原因是php://input
返回请求的HTTP头之后的所有原始数据,而不pipe内容types如何。
PHP超全局$_POST
,只是要包装数据
-
application/x-www-form-urlencoded
(标准内容types,用于简单的表单)或者 -
multipart/form-data-encoded
(主要用于file upload)
这是因为这些是用户代理必须支持的唯一内容types。 所以服务器和PHP传统上不希望收到任何其他内容types(这并不意味着他们不能)。
所以,如果你只是发布一个好的旧的HTML form
,请求看起来像这样:
POST /page.php HTTP/1.1 key1=value1&key2=value2&key3=value3
但是,如果你正在使用Ajax,那么这个概率还包括用types(string,int,bool)和结构(数组,对象)交换更复杂的数据,所以在大多数情况下,JSON是最好的select。 但是带有JSON有效载荷的请求将如下所示:
POST /page.php HTTP/1.1 {"key1":"value1","key2":"value2","key3":"value3"}
内容现在是application/json
(或者至less上面没有提到),所以PHP的$_POST
包装器不知道如何处理(还)。
数据仍然存在,你不能通过包装来访问它。 所以你需要使用file_get_contents('php://input')
以原始格式自己获取它( 只要它不是multipart/form-data
-encoded )。
这也是您如何访问XML数据或任何其他非标准内容types。
php://input
可以给你数据的原始字节。 如果POST数据是JSON编码结构,那么AJAX POST请求通常就是这种情况。
这是一个function,做到这一点:
/** * 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); }
当您处理由传统POST提交的表单中的键值数据时, $_POST
数组更有用。 这仅适用于发布的数据采用公认的格式,通常是application/x-www-form-urlencoded
(见http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4详情)。;
如果发布数据格式不正确,$ _POST将不包含任何内容。 然而,php://input将会有格式不正确的string。
例如,有一些ajax应用程序,它们不能形成正确的post-key-value序列用于上传文件,只是将所有文件转储为post数据,而不用variables名或任何东西。 $ _POST将是空的,$ _FILES也是空的,php://input将包含精确的文件,写成一个string。