PHP Post获取不到非表单数据的问题解决办法
1. 什么是PHP Post?
在PHP中,使用HTTP协议访问网站时,主要有两种请求方式:GET和POST。GET是通过URL传递参数,POST是通过表单传递参数。当我们表单中传递的数据很多时,需要上传文件时,可以使用POST方法进行传参。
2. PHP Post无法获取非表单数据的问题
PHP Post方法虽然方便,但是在使用过程中可能会遇到无法获取非表单数据的问题,特别是在需要接收json格式数据时,很容易出现问题。当我们使用以下代码获取POST数据时:
$json = json_decode(file_get_contents('php://input'), true);
?>
却发现无法获取到非表单数据。这是因为file_get_contents方法只能读取HTTP请求的正文,而http协议下,请求正文的格式与传统的K-V表单不同,这就导致了PHP Post无法获取非表单数据。
3. 解决PHP Post无法获取非表单数据的方案
3.1 使用php://input
使用PHP提供的特殊流php://input,可以获取格式为json的非表单数据。该流指向请求正文的缓冲区,在POST请求中,通过该流可以获取到全部数据。
$json = json_decode(file_get_contents('php://input'), true);
?>
该方法虽然可以解决问题,但是只适用于读取一次,因为读取后,php://input流会被清空,而原始POST数据却不变,再次读取时无法获取到数据。
3.2 使用$_SERVER
在收到POST请求时,PHP解析数据时会将数据存储到$_POST数组中。但是如果请求头中的Content-Type不是application/x-www-form-urlencoded或multipart/form-data,则$_POST数组为空。此时,如果我们要获取非表单数据,可以使用以下代码:
if(strpos($_SERVER['CONTENT_TYPE'], 'application/json') !== false){
$json = json_decode(trim(file_get_contents('php://input')), true);
}
?>
该方法通过检查请求头Content-Type,如果是application/json,则说明是非表单数据,使用file_get_contents方法获取正文数据,并解析数据。
3.3 使用HTTP_RAW_POST_DATA
在早期版本的PHP中,可以使用HTTP_RAW_POST_DATA全局变量获取POST请求的正文数据,包括非表单数据。但是在PHP5.6之后,该变量已经被废弃,无法使用。
4. 总结
PHP Post方法虽然方便,但是在接收非表单数据时,可能会遇到无法获取数据的问题。可以使用php://input、$_SERVER或HTTP_RAW_POST_DATA等方法获取非表单数据。
以上方法虽然解决了获取非表单数据的问题,但是需要根据具体的业务需求选择适用的方法。