Python通过requests发送JSON到PHP(Laravel)接口返回空如何排查?
问题1:Laravel获取表单参数的方式错误
你使用$request->json的写法是错误的:Laravel的Request类中json是方法而非属性,专门用于获取请求体为纯JSON格式的输入内容。而你Python侧是以表单(x-www-form-urlencoded/form-data)格式传参,参数名为json,正确获取指定表单参数的方式是调用input方法:
$jsonStr = $request->input('json');
问题2:json_decode结果直接输出会异常
json_decode默认会将JSON字符串转为PHP对象,你传入的是数组结构,解码后为PHP数组/对象,直接用echo输出会抛出类型警告,最终返回空内容。如果只是测试打印接收到的原始JSON数据,直接输出未解码的字符串即可,也可以用var_dump/print_r打印解码后的结构:
public function Store(Request $request) { // 直接打印收到的原始JSON字符串 echo $request->input('json'); // 如需查看解码后的结构,使用下方写法 // $decoded = json_decode($request->input('json'), true); // 第二个参数true表示转关联数组 // var_dump($decoded); }
可选优化:直接传递JSON请求体更规范
如果不需要走表单提交逻辑,更通用的做法是Python侧直接把JSON放到请求体中,不需要额外套一层表单参数:
elements = [{'id': 1, 'name': 'Alex'}, {'id': 2, 'name': 'Jessica'}] requests.post('http://localhost:8000/api/add-element', json=elements)
此时Laravel侧可以直接用json方法获取解析后的内容:
public function Store(Request $request) { print_r($request->json()->all()); }
Postman测试为空的原因
Postman测试为空和传参格式选择有关:测试原有写法时,需要在Postman的Body选项卡选择x-www-form-urlencoded或form-data,添加key为json、value为对应JSON字符串即可,不要直接选择raw->JSON格式传参,否则后端无法拿到json参数。
内容的提问来源于stack exchange,提问作者KaKi786
相关产品推荐
相关产品推荐

