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

如何通过新版Google地图Places API Autocomplete接口获取邮政编码?

如何通过新版Google地图Places API Autocomplete接口获取邮政编码?

嘿,我来帮你捋捋这个问题~ 你现在的代码只调用了Autocomplete接口,但这个接口的定位本来就是给出地址候选提示,不会直接返回完整的地址细节(比如邮政编码)。要拿到邮编,得分两步走:

问题根源

Autocomplete接口返回的是简化的地址候选,核心是给用户提供输入提示,所以默认不会包含邮政编码这类细分地址组件。你需要先通过它拿到每个候选地址的唯一标识(也就是placeId),再用这个ID去调用Place Details接口获取完整的地址信息,从中提取邮编。

具体解决方案

我给你修改并补充了代码,你可以参考:

首先,保留原有的Autocomplete请求,但在拿到结果后,新增一个请求详情的步骤,最后从详情里提取邮编:

// 原Autocomplete请求,新增后续处理逻辑
const fetchPlaces = async (inputValue: string) => {
  if (!inputValue) return;

  const response = await fetch(
    `https://places.googleapis.com/v1/places:autocomplete`,
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "X-Goog-Api-Key": process.env.NEXT_PUBLIC_GOOGLE_API_KEY || "",
      },
      body: JSON.stringify({
        input: inputValue,
        includedRegionCodes: ["us"],
        // 可选:过滤出真实地址类型的结果,避免无关候选
        types: ["address"]
      }),
    }
  );
  const autocompleteResults = await response.json();
  
  // 如果有候选结果,取第一个的ID请求详情(可根据需求遍历多个)
  if (autocompleteResults.places?.length) {
    const targetPlaceId = autocompleteResults.places[0].id;
    const placeDetails = await fetchPlaceDetails(targetPlaceId);
    // 从详情数据里提取邮政编码
    const zipCode = extractZipCodeFromDetails(placeDetails);
    // 可以把邮编附加到原结果里返回,方便后续使用
    return { ...autocompleteResults, zipCode };
  }
  return autocompleteResults;
};

// 根据placeId请求地址详情的函数
const fetchPlaceDetails = async (placeId: string) => {
  const response = await fetch(
    `https://places.googleapis.com/v1/places/${placeId}`,
    {
      method: "GET",
      headers: {
        "X-Goog-Api-Key": process.env.NEXT_PUBLIC_GOOGLE_API_KEY || "",
        // 只请求需要的字段,既高效又能节省API费用
        "X-Goog-FieldMask": "address_components",
      },
    }
  );
  return await response.json();
};

// 从详情数据中提取邮政编码的工具函数
const extractZipCodeFromDetails = (placeDetails: any) => {
  // 遍历地址组件,找到类型为postal_code的项
  return placeDetails.address_components?.find((component: any) => 
    component.types.includes("postal_code")
  )?.long_name || "未找到邮政编码";
};

几个关键注意点

  • 字段掩码(Field Mask):请求详情时一定要指定X-Goog-FieldMask,只获取你需要的address_components字段。Google API是按请求的字段计费的,少请求不必要的字段能帮你省钱~
  • 多个候选处理:如果需要给每个Autocomplete候选都加上邮编,记得遍历每个placeId分别请求,但要注意控制请求频率,避免触发API的限流机制。
  • 类型过滤:在Autocomplete请求里加上types: ["address"],可以过滤掉商家、POI这类非地址的结果,让候选更精准。

备注:内容来源于stack exchange,提问作者Netanel Vaknin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:32:57