Flutter使用http库发送Post请求传递数组时出现报错如何解决?
报错原因
- 你使用http库的post方法时,直接给
body参数传入了包含List类型值的Map:{'category':commentList}。默认情况下,http库会将未序列化的Map当做application/x-www-form-urlencoded格式处理,该格式仅支持键值均为String的参数,不支持嵌套的数组/对象类型,因此在类型转换时抛出Cast类异常。 - 你代码中注释了
Content-type: 'application/json'请求头,同时没有对请求参数做JSON序列化,也是触发报错的直接原因。 - 额外问题:你对响应的解析逻辑有误,
convert.jsonDecode(response.body)已经将JSON字符串转为Dart对象,后续再次调用json.decode(jsonResponse)会触发类型错误;且原有逻辑判断response.statusCode != 200时执行成功操作,逻辑写反。
正确实现方案
根据后端接收的参数格式二选一即可:
情况1:后端接收JSON格式参数(数组传参最常用方案)
打开注释的JSON请求头,同时将参数序列化为JSON字符串:
import 'dart:convert'; import 'package:http/http.dart' as http; List commentList = ['1','2','3']; post_preference() async { print(commentList); var response = await http.post( Uri.parse("$uri/subscriber/add_preference"), // 高版本http库需要用Uri.parse包裹请求地址 body: jsonEncode({'category':commentList}), // 将参数序列化为JSON字符串 headers: <String, String>{ 'Content-type': 'application/json', // 开启JSON格式请求头 'Accept': 'application/json', "Authorization": "Bearer $token" }, ); print(response.statusCode); var jsonResponse = jsonDecode(response.body); // 直接解码响应即可 print(jsonResponse); if (response.statusCode == 200) { // 200为请求成功状态码 Fluttertoast.showToast( msg: "successful add ", toastLength: Toast.LENGTH_SHORT, backgroundColor: Colors.green, gravity: ToastGravity.CENTER, ); Navigator.pushReplacement( this.context, MaterialPageRoute(builder: (context) => myCv()), ); } else { // 可补充请求失败的提示逻辑 print("请求失败,状态码:${response.statusCode},错误信息:$jsonResponse"); } }
情况2:后端要求接收form-urlencoded格式的数组
如果后端不支持JSON格式入参,需要用form格式传数组,给数组对应的键名加[]后缀即可:
var response = await http.post( Uri.parse("$uri/subscriber/add_preference"), body: { 'category[]': commentList, // 键名加[]后缀,http库会自动适配form格式的数组传参规则 }, headers: <String, String>{ 'Accept': 'application/json', "Authorization": "Bearer $token" }, );
内容的提问来源于stack exchange,提问作者kalide
相关产品推荐
相关产品推荐

