You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:20:39