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

