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

Flutter中用Dio发送带布尔、Double参数的GET请求报500错误

解决Dio GET请求到Django后端的500错误

既然Postman能正常发起请求但Dio不行,核心问题大概率是参数序列化格式和后端期望不匹配——毕竟Django对GET参数的类型解析有严格的字符串格式要求,而Dio的自动序列化逻辑可能和Postman的手动参数输入有差异。下面是几个针对性的解决方案,按优先级尝试:

1. 移除不必要的Content-Type请求头

GET请求的参数是拼接在URL中的,并非放在请求体里,而你添加的application/x-www-form-urlencoded是POST请求表单的头,可能会让后端的解析逻辑混乱。修改headers部分:

options: Options(
  followRedirects: false,
  validateStatus: (status) {
    return status < 500;
  },
  headers: {
    "accept": "*/*",
    "Authorization": "Bearer $auth",
    // 移除这一行:"Content-Type": "application/x-www-form-urlencoded"
  }
)

2. 手动转换参数为后端期望的字符串格式

Django对布尔值、浮点数的字符串解析有特定要求,比如布尔值可能需要小写的"true"/"false",浮点数不能是科学计数法格式。手动转换参数:

Map<String, dynamic> payload = {
  "switch": _switch.toString().toLowerCase(), // 强制转为小写布尔字符串
  "s_currency": senderCurrencyVal,
  "r_currency": recieverCurrencyVal,
  "amount": amount.toStringAsFixed(2) // 按保留两位小数的格式转字符串,适配后端解析
};

如果后端对浮点数格式没有固定小数位要求,用amount.toString()即可,但要避免出现科学计数法(比如极大/极小的数字)。

3. 手动拼接URL参数,绕过Dio的自动序列化

如果上面的方法无效,可能是Dio的queryParameters序列化逻辑有隐藏问题,直接手动构建完整URL:

Future<Converter> currencyConverter() async {
  String convertURL = baseURL + 'convert/currency/';
  String auth = await localpref.getString('access');
  
  // 手动构建query参数字符串
  String queryParams = Uri(
    queryParameters: {
      "switch": _switch ? "true" : "false",
      "s_currency": senderCurrencyVal,
      "r_currency": recieverCurrencyVal,
      "amount": amount.toString(),
    },
  ).query;
  
  String fullRequestUrl = "$convertURL?$queryParams";

  try {
    var res = await dio.get(
      fullRequestUrl,
      options: Options(
        followRedirects: false,
        validateStatus: (status) {
          return status < 500;
        },
        headers: {
          "accept": "*/*",
          "Authorization": "Bearer $auth",
        }
      )
    );
    // 后续逻辑不变...
  } catch (e) {
    print(e);
  }
}

4. 开启Dio日志,对比Postman的请求URL

添加日志拦截器,查看Dio实际发送的URL,和Postman里的请求URL做对比,就能精准定位参数差异:

// 在初始化Dio的地方添加拦截器
dio.interceptors.add(LogInterceptor(
  request: true, // 打印请求信息
  requestHeader: false,
  requestBody: false,
));

运行后查看控制台输出的请求URL,和Postman的URL对比,重点看switch、amount参数的格式是否一致。

这些方法应该能解决问题,毕竟Postman能正常运行说明后端逻辑没问题,只是Dio的请求格式和后端期望不匹配而已。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:03:12