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
相关产品推荐
相关产品推荐

