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

