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

