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

Flutter中通过参数构建HTTP GET请求异常问题求助

问题:Uri.http传递参数构建GET请求失败,手动拼接URL却正常

我在发送带参数的HTTP GET请求时遇到异常:手动在URL中拼接参数能正常返回结果,但通过Uri.http传递参数的方式构建请求时,会抛出无明确说明的异常,执行到Uri.http步骤后就停止了。

尝试的失败代码:

Future<List<LawFirm>> getLawFirms () async {
  Map<String, dynamic> parameters = {
    'total': true
  };
  final uri =
  Uri.http('www.vision.thefuturevision.com:5000',
      '/api/law-firm', parameters);
  final response = await http.get(uri);
  var dynamicResponse = jsonDecode(response.body);
  totaLawFirms = await dynamicResponse['total'];
  var lawFirms = await dynamicResponse['data'];
  List<LawFirm> list = List<LawFirm>.from(lawFirms.map((x) => LawFirm.fromJson(x)));
  print(list);
  notifyListeners();
  return list;
}

手动拼接URL的正常代码(但不想采用该方式):

final response = await get(Uri.parse('$baseURL/law-firm?total=true'));

我还尝试了dio库,同样没有解决问题,求各位帮忙。


解决方案

1. 移除不必要的await调用

你的代码里存在两个错误的await操作:

totaLawFirms = await dynamicResponse['total'];
var lawFirms = await dynamicResponse['data'];

dynamicResponse是jsonDecode同步解析后的结果,并非Future对象,在非异步值上使用await会直接抛出类型异常,这是导致代码停止的核心原因。

修正后代码:

totaLawFirms = dynamicResponse['total'];
var lawFirms = dynamicResponse['data'];

2. 添加异常捕获定位问题

在代码中加入try-catch块,打印具体异常信息和堆栈,方便排查其他潜在问题:

Future<List<LawFirm>> getLawFirms () async {
  try {
    Map<String, dynamic> parameters = {
      'total': true
    };
    final uri = Uri.http('www.vision.thefuturevision.com:5000', '/api/law-firm', parameters);
    print('生成的请求URL:$uri'); // 对比手动拼接的URL是否一致
    final response = await http.get(uri);
    print('响应状态码:${response.statusCode}'); // 确认请求是否正常到达后端
    var dynamicResponse = jsonDecode(response.body);
    totaLawFirms = dynamicResponse['total'];
    var lawFirms = dynamicResponse['data'];
    List<LawFirm> list = List<LawFirm>.from(lawFirms.map((x) => LawFirm.fromJson(x)));
    print(list);
    notifyListeners();
    return list;
  } catch (e, stackTrace) {
    print('错误信息:$e');
    print('堆栈跟踪:$stackTrace');
    rethrow;
  }
}

3. Dio库的正确使用方式

如果继续使用dio,确保用queryParameters参数传递GET参数,而非手动拼接:

Dio dio = Dio();
Response response = await dio.get(
  'http://www.vision.thefuturevision.com:5000/api/law-firm',
  queryParameters: {'total': true}
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:18:20