Flutter调用Google Maps地址转坐标报REQUEST_DENIED错误解决方案
问题根因定位
你遇到的REQUEST_DENIED报错首先来自代码中的URL拼接错误:请求地址里key$googleApiKey缺少等号,导致API密钥根本没有作为有效参数传递给接口,服务端识别不到鉴权信息自然会返回访问被拒绝。
分步排查修复
- 第一步:修正URL拼接错误
手动拼接字符串很容易出现参数格式错误、特殊字符未转义的问题,建议用Dart原生的Uri构造方法生成请求地址,同时补充结果判空逻辑避免数组越界崩溃,修复后的代码如下:static Future<String> getPlaceId(String input) async { // 用Uri原生构造方法自动处理参数转义、格式拼接 final uri = Uri( scheme: 'https', host: 'maps.googleapis.com', path: 'maps/api/place/findplacefromtext/json', queryParameters: { 'input': input, 'inputtype': 'textquery', 'key': googleApiKey, // 自动拼接为key=密钥的正确格式 'fields': 'place_id,geometry' // 可直接声明需要返回坐标字段,减少后续请求 } ); var response = await http.get(uri); Map<String, dynamic> json = jsonDecode(response.body); print(json); // 先校验返回结果再取值,避免空数组报错 if (json['candidates'] == null || json['candidates'].isEmpty) { throw Exception('未查询到匹配地点'); } var placeId = json['candidates'][0]['place_id'] as String; return placeId; } - 第二步:校验API密钥配置有效性
如果修正URL后仍然报错,按以下顺序检查配置:- 发起请求前打印
googleApiKey变量值,确认变量已正确初始化、不是空值,排除配置文件读取失败、变量未赋值的问题 - 确认对应密钥在Google Cloud控制台已开启Places API服务,未开通对应服务权限的密钥无法调用接口
- 如果密钥配置了应用限制(包名、SHA1签名、IP白名单),确认调试/发布环境的应用信息已加入白名单,否则会被服务端拦截
- 发起请求前打印
地址转坐标替代实现方案
如果不想自行维护HTTP请求逻辑,或者需要适配不同使用场景,可以选择以下方案:
- 使用官方封装的
flutter_google_places_sdk插件:不需要手动拼接请求,内置地点搜索、输入补全、坐标查询能力,鉴权逻辑封装在插件内部,减少手写代码的出错概率 - 直接调用Google Geocoding API:如果业务不需要获取placeId,仅需要地址转经纬度,可以直接调用地理编码接口,传入地址文本即可直接返回坐标结果,请求链路更短
- 国内场景替换为国内地图服务商SDK:如果应用主要面向国内用户,可以换成高德、百度地图的地理编码能力,不需要特殊网络环境,国内地址匹配精度更高,配置流程更简单
内容的提问来源于stack exchange,提问作者TimeToCode
相关产品推荐
相关产品推荐

