Flutter发送含列表数据的raw body POST请求无成功响应怎么解决?
你提供的Postman请求参考截图:
问题定位
- 你设置了请求头
Content-Type: application/json,但直接将Dart Map对象作为body参数传入了POST请求:Dart的http包不会自动将Map序列化为JSON字符串,默认会将Map转为x-www-form-urlencoded格式的表单数据,和你声明的请求体格式不一致,服务端无法正常解析参数。 - 你代码中实际请求使用的是硬编码的
body变量,和你打印的saveBookingRequestModel.toJson()没有关联,如果你是要使用请求模型的序列化结果,硬编码的参数也会和预期不符。
修正步骤
- 首先确认你已经引入了
dart:convert库,用于JSON序列化 - 将请求体Map传入
jsonEncode方法转为JSON字符串后,再作为body参数传入请求 - 如果你要使用
SaveBookingRequestModel构造的参数,直接序列化该模型的toJson()结果即可,不需要额外硬编码请求体
修正后的代码示例
import 'dart:convert'; // 必须引入 Future<SaveBookingModel> saveBookingModel(SaveBookingRequestModel saveBookingRequestModel, BuildContext context) async{ String url = baseUrl + "booking/save"; // 如果要用硬编码的body就保留下面这段,要用模型的话直接删掉这段就行 var body = { "customer_id": "2", "location_id": "1", "discount_amount": "20.00", "discount_voucher": "V123", "BookingItems": [{ "court_id": "3", "from_time": "21/10/2021 7:00PM", "to_time": "21/10/2021 8:00PM ", "amount": "150.00", "hours": "1", "time_slot_from": "7", "time_slot_to": "8" }, { "court_id": "3", "from_time": "21/10/2021 10:00PM", "to_time": "21/10/2021 11:00PM", "amount": "100.00", "hours": "1", "time_slot_from": "10", "time_slot_to": "11" } ], "BookingPayments": [{ "paid_amount": "230.00", "payment_desc": "desc", "payment_status": "1", "payment_method": "8", "reference1": "reference1", "reference2": "reference2", "reference3": "reference3" } ] }; print("Save booking request body ${saveBookingRequestModel.toJson()}"); Utils.showLoaderDialog(context); final response = await http.post(Uri.parse(url), headers: { "Accept": "application/json", "Content-Type":"application/json", 'Authorization':'Bearer ${Utils.token}', }, // 关键修改:序列化Map为JSON字符串,要用模型的话就改成 jsonEncode(saveBookingRequestModel.toJson()) body: jsonEncode(body) ); print("Save booking request response $saveBookingRequestModel"); print("Save booking response response ${response.body}"); if(response.statusCode == 200){ Navigator.pop(context); return SaveBookingModel.fromJson(json.decode(response.body)); }else { return Utils.errorDialog(context, "Something went wrong"); } }
内容的提问来源于stack exchange,提问作者Vinay Bakle
相关产品推荐
相关产品推荐

