PHP接收Lora设备POST数据时$_POST为空数组的问题求解
问题根源
- PHP的
$_POST超全局变量仅支持解析Content-Type为application/x-www-form-urlencoded或multipart/form-data的POST请求,Lora类IoT设备发送POST请求时,通常携带的是raw格式的JSON/二进制数据,Content-Type多为application/json,这类数据不会被自动解析到$_POST中,因此你拿到的是空数组。
修复方案
替换原有代码,从PHP原生输入流读取原始POST数据即可,示例代码如下:
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { // 读取原始POST请求体 $rawPostData = file_get_contents('php://input'); // 直接写入原始内容,若需要数组操作可调用json_decode($rawPostData, true)转换 file_put_contents('aa.txt', $rawPostData); } ?>
如果需要同时排查请求头信息,可使用扩展版本代码:
<?php if ($_SERVER["REQUEST_METHOD"] == "POST") { $logData = [ 'request_headers' => getallheaders(), 'request_body' => file_get_contents('php://input') ]; file_put_contents('aa.txt', json_encode($logData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); } ?>
额外排查项
- 确认aa.txt文件所在目录有可写权限,权限不足也会导致写入内容异常
- 如果设备发送的是二进制非结构化数据,不需要做json编码处理,直接写入原始数据即可
内容的提问来源于stack exchange,提问作者Nidhi
相关产品推荐
相关产品推荐

