树莓派4 Python发送JSON至Laravel无响应及数据展示问题求助
问题修复方案
1. 问题根因梳理
GET请求不适合携带请求体数据,你用requests.get的data参数传递JSON,Laravel默认不会读取GET请求的请求体内容,自然拿不到数据- Laravel的
store方法按照规范应该对应POST请求,当前路由定义为GET不符合数据提交的逻辑 - 手动序列化JSON再传递的方式容易出现请求头不匹配的问题,requests库有更简便的JSON传递方案
2. Python代码修改
把最后的请求部分改为POST请求,直接传字典给json参数,requests会自动设置Content-Type: application/json请求头,也不需要你手动做JSON序列化:
# 替换原有的requests.get请求代码 r = requests.post(ip, json=mac_dict) print(r.text)
注意ip参数需填写你Laravel服务的完整API地址,比如http://你的服务地址/api/dictionary,如果是局域网测试填对应局域网IP即可。
3. Laravel路由修改
把api.php里的路由改为POST类型:
Route::post('dictionary', [DictionaryController::class, 'store'])->name('dictionary');
4. Laravel控制器逻辑调整
调试阶段可以直接返回接收的数据验证是否正常:
public function store(Request $request) { return response()->json($request->all()); }
如果需要把接收的JSON存为文件可以改成:
public function store(Request $request) { $data = $request->all(); // 文件存在storage/app目录下 file_put_contents(storage_path('app/mac_addr.json'), json_encode($data, JSON_PRETTY_PRINT)); return response()->json(['status' => 'success', 'received_data' => $data]); }
5. Blade页面展示JSON内容
首先在控制器的index方法读取存好的JSON文件,传递给视图:
public function index() { $jsonPath = storage_path('app/mac_addr.json'); $macData = file_exists($jsonPath) ? json_decode(file_get_contents($jsonPath), true) : []; return view('backend.auth.user.dictionary', compact('macData')); }
然后在dictionary.blade.php里展示内容,两种常用展示方式:
<!-- 方式1:格式化输出完整JSON结构 --> <pre> {{ json_encode($macData, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE) }} </pre> <!-- 方式2:遍历成可读列表 --> @if(count($macData) > 0) <ul> @foreach($macData as $macAddr => $rssiList) <li>MAC地址:{{ $macAddr }},对应RSSI值:{{ implode(', ', $rssiList) }}</li> @endforeach </ul> @else <p>暂未收到蓝牙数据</p> @endif
注意事项
api.php下的路由默认没有开启CSRF验证,不用额外处理跨域请求的令牌问题,如果出现419错误可以确认下路由是否放在了web.php里,如果是的话需要把请求地址加入CSRF白名单。
内容的提问来源于stack exchange,提问作者user11989615
相关产品推荐
相关产品推荐

