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

Flutter中Dio发起post请求报500及序列化失败问题求助

问题根因

两个Dio报错的核心原因是请求体传参格式错误:

  • DioError [DioErrorType.other]: Converting object to an encodable object failed: _LinkedHashSet len:1:Dio序列化请求体时仅支持Map、List、基础类型等可直接转JSON的结构。你在编写data参数时给实际请求对象多套了一层大括号,在Dart语法中,{ {key: value} }这种无键的嵌套大括号外层不是Map,是Set类型,Set无法直接被JSON序列化,因此在请求发出前的序列化阶段就抛出错误。
  • DioError [DioErrorType.response]: Http status error [500]:错误格式的请求体发送到服务端后,后端无法正常解析入参,触发服务端内部错误。Postman测试正常是因为Postman发送的是标准JSON结构,和你代码实际生成的请求结构完全不同。

原代码错误位置如下:

data: {
  { // 多余的大括号,把内层Map包成了Set的单个元素
    "ClientPackageId": "0cdd231a-d7ad-4a68-a934-d373affb5100",
    "PlatformId": "ios",
    "ClientUserId": "AhmedOmar",
    "VinNumber": VINumber
  }
},
修复方案

删除多余的外层大括号,直接传入Map结构的请求体即可,修正后的完整代码:

Future<void> signInData([data]) async {
    final prefs = await SharedPreferences.getInstance();
    final String token = prefs.getString('token') ?? "";

    try {
      Response response = await _dio.post('$_baseUrl/api/gateway',
          data: {
            "ClientPackageId": "0cdd231a-d7ad-4a68-a934-d373affb5100",
            "PlatformId": "ios",
            "ClientUserId": "AhmedOmar",
            "VinNumber": VINumber
          },
          options: Options(headers: {
            "Content-Type": "application/json",
            "Authorization": "Bearer $token",
          }));
      print(response.data);
      print(response.statusCode);
      if (response.statusCode == 401) {
        await getToken();
        signInData(data);
      }
    } catch (e) {
      print(e);
    }
  }
避坑提示
  • Dart语法中,Map字面量格式为{key: value},Set字面量格式为{单个元素, 多个元素},如果把一个值直接放在{}内不配对写键,就会被识别为Set类型,编写传参代码时需要留意这个语法差异。
  • 后续如果再遇到同类序列化报错,可以在传参前打印参数的runtimeType,确认传入的是Map/List类型,而非Set、未做toJson处理的自定义对象等无法直接序列化的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:39:53