Flutter http.post发送JSON请求,Laravel API无法读取请求体求助
问题排查:Flutter POST JSON数组到Laravel API时字段未被识别
我用Flutter开发移动端应用,从Hive数据库取数据转成JSON数组后,通过http.post发送给Laravel后端API,但API一直返回请求为空的提示——所有必填字段都没被读取到,还出现了我JSON里没有的kwhProd、keterangan字段必填提示,求协助排查。
相关代码与信息
1. Flutter的SendDataBacklog方法
Future<void> SendDataBacklog() async { var jsonBacklog = jsonEncode(backlogList); final response = await http.post( Uri.parse('http://109.141.122.292/asmankit-api/api/koko/t1a/input/test'), headers: <String, String>{ 'Content-Type': 'application/json; charset=UTF-8', }, body: jsonBacklog, ); if (response.statusCode == 200) { //show your outputs Hive.box('asmankit_backlog').clear(); AlertPostBerhasil(context); } else { print('Backlog data: $jsonBacklog'); print("response backlog: " + response.body); AlertKoneksiFailed(context); } }
2. 生成的JSON数据
[{ "tanggal_catat": "2022-12-08 21:28:18", "id_mesin": "12", "hsd": "11", "rpm": "11", "tekOli": "11", "tempMasuk": "11", "tempKeluar": "11", "tempMesin": "11", "r": "11", "s": "11", "t": "11", "kw": "11", "hz": "11", "volt": "11", "cosQ": "11", "age": "testing| Backlog" }, { "tanggal_catat": "2022-12-08 23:22:29", "id_mesin": "12", "hsd": "99", "rpm": "99", "tekOli": "99", "tempMasuk": "99", "tempKeluar": "99", "tempMesin": "99", "r": "99", "s": "99", "t": "99", "kw": "99", "hz": "99", "volt": "99", "cosQ": "99", "age": "testing| Backlog" }]
3. API返回的错误响应
{"success":false,"message":"Silahkan Isi Data Yang Kosong","data":{"tanggal_catat":["Masukkan Title Post !"],"id_mesin":["Masukkan Title Post !"],"hsd":["Masukkan Content Post !"],"rpm":["Masukkan Content Post !"],"tekOli":["The tek oli field is required."],"tempMasuk":["The temp masuk field is required."],"tempKeluar":["The temp keluar field is required."],"tempMesin":["The temp mesin field is required."],"r":["Masukkan Content Post !"],"s":["Masukkan Content Post !"],"t":["Masukkan Content Post !"],"kw":["Masukkan Content Post !"],"hz":["Masukkan Content Post !"],"volt":["Masukkan Content Post !"],"cosQ":["Masukkan Content Post !"],"kwhProd":["Masukkan Content Post !"],"keterangan":["Masukkan Content Post !"]}}
4. Flutter模型的toJson方法
Map<String, String> toJson() => { 'tanggal_catat': waktuCatat, 'id_mesin': idMesin, 'hsd': hsd, 'rpm': rpm, 'tekOli': tekOli, 'tempMasuk': tempMasuk, 'tempKeluar': tempKeluar, 'tempMesin': tempMesin, 'r': r, 's': s, 't': t, 'kw': kw, 'hz': hz, 'volt': volt, 'cosQ': cosQ, 'age': keterangan + "| Backlog", };
排查与解决方案
1. Laravel后端接收格式不兼容
Laravel默认不会自动解析JSON数组作为表单请求参数,若API原本只支持接收单个对象,直接传数组会导致所有字段无法被识别,触发全字段必填报错:
- 如果要批量插入多条数据:后端需要调整接收逻辑,用
$request->json()->all()获取整个数组,再遍历逐个校验插入; - 如果API仅支持单条提交:修改Flutter代码,循环遍历
backlogList逐个发送请求,而非一次性发数组。
2. 字段名/需求不匹配
错误响应里的kwhProd、keterangan必填提示,说明后端校验规则要求这两个字段,但你的JSON里没有:
- 检查Laravel后端的验证规则:如果确实需要这两个字段,在Flutter的
toJson方法中添加对应字段映射;如果不需要,后端移除这两个字段的必填校验; - 注意你的
age字段是keterangan + "| Backlog",可能后端期望的字段名是keterangan而非age,这会导致后端识别不到该字段,同时触发keterangan的必填校验。
3. 验证请求是否被正确解析
在Laravel控制器方法中添加调试代码,确认是否接收到JSON数据:
public function test(Request $request) { // 打印原始请求内容,确认是否收到数据 dd($request->getContent()); // 或者打印解析后的JSON数组 dd($request->json()->all()); }
4. 批量提交的后端适配示例
如果后端要支持批量插入,控制器代码可参考:
public function test(Request $request) { $dataList = $request->json()->all(); foreach ($dataList as $data) { $validated = Validator::make($data, [ 'tanggal_catat' => 'required', 'id_mesin' => 'required', 'hsd' => 'required', // 其他字段校验规则,注意和Flutter端字段名匹配 'keterangan' => 'required', // 若后端需要,Flutter端需传对应字段 // 移除不需要的kwhProd校验,或让Flutter添加该字段 ]); if ($validated->fails()) { return response()->json([ 'success' => false, 'message' => '数据校验失败', 'errors' => $validated->errors() ], 422); } // 执行插入逻辑 // YourModel::create($validated->validated()); } return response()->json(['success' => true]); }
内容的提问来源于stack exchange,提问作者Agustyan
相关产品推荐
相关产品推荐

