Flutter调用OpenWeatherMap报401无效API密钥错误如何解决
OpenWeatherMap 401 Invalid API Key 修复方案
该报错和Geolocator获取经纬度的逻辑无关,核心是接口权限、地址或参数格式问题,按以下步骤排查修复即可:
- 优先修正接口版本问题
你当前调用的/data/3.0/onecall是OpenWeatherMap v3版本的OneCall接口,属于付费订阅类接口,新注册的免费账号默认没有该接口的调用权限,哪怕密钥处于激活状态、复制完全正确也会返回401无效密钥错误。
开发测试阶段直接替换为免费开放的v2.5版本OneCall接口即可,v2.5接口参数和v3.0基本兼容,返回结构差异极小,免费额度足够日常调试使用,修改后的请求代码如下:
const APIKey = '69f9afe03f52ef5c83887fc86dd79d99'; void getData() async { // 注意将路径里的3.0改为2.5,同时确认参数连接符是原生&不是HTML转义的& http.Response response = await http.get(Uri.parse('https://api.openweathermap.org/data/2.5/onecall?lat=$latitude&lon=$longitude&appid=$APIKey')); if (response.statusCode == 200) { String data = response.body; var decodedData = jsonDecode(data); print(decodedData); } else { print(response.statusCode); // 调试阶段可额外打印响应体查看具体错误原因 print(response.body); } }
- 必须修正参数转义问题
你贴出的代码里参数连接符写的是&,这是HTML转义后的和号,在Dart代码里直接写会被当成普通字符串,导致请求参数无法被服务端正确解析,服务端读取不到有效的appid参数也会返回401,要把所有&替换为原生的&符号。 - 其他排查项
- 刚生成的API密钥存在最长2小时的服务端同步延迟,如果是刚创建的密钥,等待1-2小时后再测试即可,不需要反复重新生成密钥。
- 如果你确实需要使用v3.0版本接口,需要到OpenWeatherMap后台手动订阅OneCall 3.0套餐,即使选每月1000次调用的免费档位,也要走完订阅流程,密钥才会开通v3.0接口的调用权限。
- 如果你给密钥配置了IP白名单、调用频率限制等安全规则,要把测试设备的出口IP加到白名单中,否则也会被拦截返回401。
内容的提问来源于stack exchange,提问作者user16746875
相关产品推荐
相关产品推荐

