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

Flutter实现HTTP PUT请求更新数据库数据问题咨询

HTTP PUT请求更新字段不生效问题修复

你当前的代码存在几个容易导致请求失效的问题,逐一修复即可实现点击按钮更新status字段的需求:

  • 请求头缺失:默认情况下http包的PUT请求会以纯文本格式传输请求体,绝大多数后端接口无法识别这种格式的参数,需要显式声明和后端匹配的Content-Type请求头。
  • 异常未捕获:当前按钮的点击逻辑没有处理请求失败的场景,一旦网络异常、接口报错就会直接抛出未捕获异常,没有任何用户提示。
  • 类型不匹配:submitData方法声明的返回值是非空DataModel,调用时却用可空类型DataModel?接收,会产生编译警告,也容易引发空安全相关的报错。
  • 注释与逻辑不一致:代码注释标注判断201状态码为成功,实际逻辑判断的是200,后续排查问题时容易产生误导。

修正后的请求方法代码

Future<DataModel> submitData(String status, int testimonial_id) async {
  final response = await http.put(
      Uri.http('10.0.2.2:5001', '/update/testimony/$testimonial_id'),
      // 表单格式请求头,如果后端要求JSON格式就替换为application/json
      headers: {
        "Content-Type": "application/x-www-form-urlencoded"
      },
      body: {
        "status": status,
      });
  // 以实际后端返回的成功状态码为准,更新操作通常返回200
  if (response.statusCode == 200) {
    String responseString = response.body;
    return dataModelFromJson(responseString);
  } else {
    // 抛出异常时携带错误信息,方便排查问题
    throw Exception('更新失败,状态码:${response.statusCode},错误信息:${response.body}');
  }
}

修正后的按钮实现代码

Widget myLayoutWidget(int testimonial_id) {
    return Container(
      child: Row(
        children: <Widget>[
          ButtonTheme(
            minWidth: 4,
            child: RaisedButton(
              onPressed: () async {
                try {
                  showToastAccept();
                  const String status = 'approve';
                  // 类型对齐,使用非空类型接收
                  DataModel data = await submitData(status, testimonial_id);
                  setState(() {
                    _dataModel = data;
                  });
                } catch (e) {
                  // 异常兜底逻辑,可替换为失败提示toast
                  print("状态更新出错:$e");
                }
              },
              child: const Text(
                "Approve",
              ),
            ),
          ),
        ],
      ),
    );
  }

补充说明:如果后端要求接收JSON格式参数,需要将请求头修改为"Content-Type": "application/json",同时将body参数改为jsonEncode({"status": status})传入;如果是真机调试,不能使用10.0.2.2地址,需要替换为开发机所在局域网的实际IP。

内容的提问来源于stack exchange,提问作者Gift

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 01:42:36