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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:48:56