用http.client发get请求即可,但必须带ak、正确拼sn(如启用sn校验)、注意坐标系和返回格式,否则401或坐标偏移。

直接结论:用 http.Client 发 GET 请求即可,但必须带 ak、正确拼 sn(如启用 SN 校验)、注意坐标系和返回格式,否则 401 或坐标偏移。
如何构造合法的 geocoding 请求 URL
百度地理编码接口要求参数严格拼接,尤其 sn 是签名值,不是固定字符串。若在控制台开启「SN 校验」,缺 sn 或计算错误会直接返回 {"status":302}(非法请求)。
-
ak必须是浏览器端类型应用申请的密钥(服务端调用不支持 IP 白名单校验,仅限 Referer) - 所有查询参数(
address、output、ak)需按字典序拼进 path,再加sk做 MD5(注意:不是 HMAC) -
sn计算前,整个原始 URL 路径部分(不含域名)必须先做url.QueryEscape,否则中文地址会导致签名失败 - 示例关键片段:
path := "/geocoding/v3/"
data := url.Values{
"address": {"北京市海淀区上地十街10号"},
"output": {"json"},
"ak": {yourAK},
}
rawURL := path + "?" + data.Encode()
escaped := url.QueryEscape(rawURL)
hash := md5.Sum([]byte(escaped + yourSK))
sn := hex.EncodeToString(hash[:])
为什么用 http.Client 而不用第三方 SDK
百度官方没有提供 Go 语言 SDK,社区包大多过时或硬编码了旧版 v2 接口(已下线)。自己封装 http.Client 更可控,也避免引入不维护的依赖。
Colly 是一个用于 Go 语言的快速开源爬取和爬虫框架。它适用于从简单的页面提取到异步爬虫处理大量页面集合,支持请求回调和结构化解析。
- v3 接口路径是
/geocoding/v3/,不是/geocoder/v2/(后者已停用) - 返回字段名变了:
result.location.lng→result.location.lng(v3 仍是小写),但status含义一致(0 表示成功) - 务必检查响应
Content-Type是否为application/json,百度偶尔会因参数错返回 HTML 错误页,json.Unmarshal会静默失败
常见报错及对应原因
调试时最常遇到的几个状态码,基本能定位问题根源:
-
{"status":302}→ SN 校验失败:检查sk是否正确、是否漏了url.QueryEscape、参数顺序是否字典序 -
{"status":200,"message":"INVALID_REQUEST"}→address参数为空或超长(>128 字节),或含非法字符(如未转义的换行) -
{"status":401}→ak无效:确认是浏览器端类型、未过期、且控制台「服务权限」已开启「地理编码服务」 - 经纬度明显偏移(比如上海返回到江苏)→ 没传
ret_coordtype=gcj02ll,而你前端用的是高德/腾讯地图(它们用 GCJ-02),百度默认返回bd09ll
逆地理编码(坐标转地址)要注意什么
调用 /reverse_geocoding/v3/ 时,location 参数格式是 "纬度,经度"(注意:先纬后经,和日常说的“经纬度”顺序相反)。
- 字段名是
location,不是latlng或point - 若需行政区划代码(
cityCode),必须显式加extensions=1参数,否则不返回 - 返回的
formatted_address是拼接后的字符串,addressComponent才含结构化字段(省、市、区等),但部分字段可能为空(如农村地址无district) - 不要依赖
city字段判断城市——它可能是空字符串,优先看addressComponent.city
真正容易被忽略的是:百度对单 IP 的 QPS 限制极严(通常 10 次/秒),且错误响应不带 Retry-After。批量调用时必须加 time.Sleep,否则大量 status: 301(配额超限)会淹没真实错误。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










