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

Flutter调用Edamam食品数据库API返回错误无数据,Uri.https参数疑存问题求助

问题分析与解决

嘿,我一眼就瞅出问题在哪了!你确实猜对了,问题就出在Uri.https()的参数使用方式上。

Uri.https()的第二个参数只需要传入纯路径部分(也就是域名后面的/api/food-database/v2/parser),所有的查询参数(比如app_id、app_key、ingr这些)应该单独放在第三个可选参数queryParameters里,用键值对的Map来传递。你现在把带查询参数的完整字符串都塞到第二个参数里,导致构建出来的URL格式不符合API要求,所以才返回了错误响应。

修正后的代码

getFoods(String query) async {
  String urlHost = "api.edamam.com";
  String path = "/api/food-database/v2/parser";
  
  // 用Map统一存放所有查询参数
  Map<String, String> queryParams = {
    "app_id": appID,
    "app_key": appKey,
    "ingr": query,
    "nutrition-type": "cooking"
  };
  
  var response = await http.get(Uri.https(urlHost, path, queryParams));
  print(response.body);
}

为什么这样改更靠谱?

  • Uri.https()会自动帮你处理URL编码,比如如果query是带空格的内容(比如"chicken breast"),它会自动转换成chicken%20breast,避免手动拼接URL时踩编码的坑。
  • 拆分路径和查询参数的写法更清晰,也符合Dart构建Uri的规范,后续维护参数也更方便。

你之前在浏览器里直接用完整URL能成功,是因为浏览器会自动解析整个URL的结构,但Flutter的Uri.https()是分部分构建的,必须遵循它的参数规则才行。现在把代码改成上面的样子,应该就能正常拿到Edamam API的响应数据了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:37:35