file_get_contents("php://input")或$HTTP_RAW_POST_DATA,哪个更好地获取JSON请求的主体?
file_get_contents("php://input")或$HTTP_RAW_POST_DATA,哪个更好地获取JSON请求的主体?
在使用client side XmlHTTPRequest发送JSON数据时,使用file_get_contents("php://input")
或者$HTTP_RAW_POST_DATA
,哪一个更好来获取JSON请求的主体?
而在使用client side XmlHTTPRequest发送JSON数据时,应该使用GET
还是POST
请求类型?
我的问题是受到这个答案的启发:
How to post JSON to PHP with curl
那个答案中的引用如下:
从协议的角度来看,
file_get_contents("php://input")
实际上更正确,因为你实际上并不处理http多部分表单数据。
在开发API时,有时需要接收无法通过PHP解码为$_POST的XML、JSON等输入数据。这时可以使用`file_get_contents("php://input")`来获取原始的POST数据。
以下是一个示例,通过POST方式发送JSON字符串:
在1.php中,使用`file_get_contents('php://input')`获取POST请求的原始数据:
//print_r($_POST); //empty!!! don't work ... var_dump(file_get_contents('php://input'));
上述代码在接收到POST请求后,会输出原始的POST数据。
那么为什么要使用`file_get_contents("php://input")`来获取POST数据呢?原因是由于PHP在解析POST数据时,只有当数据是`application/x-www-form-urlencoded`或`multipart/form-data`格式时,才会将数据解码为`$_POST`数组。而当数据是XML、JSON等格式时,PHP无法自动解析。
为了解决这个问题,可以使用`file_get_contents("php://input")`获取原始的POST数据,然后根据数据格式进行相应的解析操作。
,`file_get_contents("php://input")`更适用于接收无法通过PHP解码为`$_POST`的XML、JSON等输入数据。
在处理POST请求时,使用`php://input`而不是`$HTTP_RAW_POST_DATA`更可取,因为`php://input`是一个只读流,允许从请求体中读取原始数据。相比之下,`$HTTP_RAW_POST_DATA`依赖于特定的php.ini指令,并且在某些情况下可能没有默认值。此外,对于那些默认情况下`$HTTP_RAW_POST_DATA`没有值的情况,`php://input`是一种潜在的更节省内存的选择,不需要开启`always_populate_raw_post_data`选项。
解决方法很简单,只需要使用`php://input`来获取请求体的内容,而不是使用`$HTTP_RAW_POST_DATA`。在PHP 5.6及其之后的版本中,`$HTTP_RAW_POST_DATA`已被认为是废弃的,可以使用`php://input`来替代。
这个问题的出现是因为`$HTTP_RAW_POST_DATA`依赖于特定的php.ini指令,并且在某些情况下可能没有默认值,而`php://input`是一个通用的解决方案,不需要任何特殊的配置。
总结起来,使用`php://input`来获取JSON请求的请求体是更好的选择,因为它不依赖于特殊的php.ini指令,并且在所有情况下都可用。而`$HTTP_RAW_POST_DATA`则已被认为是废弃的,并且在某些情况下可能没有默认值。所以,为了保持代码的兼容性和可靠性,建议使用`php://input`来获取JSON请求的请求体。
问题出现的原因是:$HTTP_RAW_POST_DATA虽然可以用来获取JSON请求的主体,但在PHP 5.6之后被视为不推荐使用的,并且在PHP 7中已经废弃。而php://input是一种更低内存占用的替代方法,不需要任何特殊的php.ini指令,并且可以在PHP 7.1中用于获取URL中的$_GET值。
解决方法是:使用json_decode函数结合file_get_contents('php://input')来获取JSON请求的主体。这种方法在PHP 7.1中支持从URL中获取$_GET值,并且能够替代已经废弃的$HTTP_RAW_POST_DATA。
以下是整理后的
实际上,php://input允许你读取原始的请求主体。它是一种较低内存占用的替代方法,不需要任何特殊的php.ini指令。根据PHP的参考文档,php://input不能在enctype="multipart/form-data"的情况下使用。
另外,在PHP 5.6之后,$HTTP_RAW_POST_DATA被视为不推荐使用,并且可以重用php://input。你可以参考enable_post_data_reading来了解更多信息。
如果你想在PHP 7.1中从URL中获取$_GET的值,你可以使用json_decode(file_get_contents('php://input'),true)来实现。这种方法是对于获取JSON请求主体的一种替代方案,并且能够替代已经废弃的$HTTP_RAW_POST_DATA。
总结起来,使用file_get_contents('php://input')结合json_decode函数来获取JSON请求的主体是一种更好的方法,特别是在PHP 7.1之后。它不仅能够替代已经废弃的$HTTP_RAW_POST_DATA,还能够支持从URL中获取$_GET的值。