获取外网IP:返回字段全解(IP / 经纬度 / 归属地 / 运营商)
# 获取外网IP:返回字段全解(IP / 经纬度 / 归属地 / 运营商)
> 接口:获取外网IP(apiCode 632,接入点 1) · 免费 · POST/GET · JSON · 适用:所有接入者 · 阅读约 6 分钟
## 核心要点
- 返回体分两层:系统级(`showapi_res_code` 等)+ 业务层(`showapi_res_body` 内的 IP/归属地/经纬度)。
- 经纬度是 `lnt`(经度)/ `lat`(纬度);`en_name_short` 是**国家英文短码**(如 `CN`),不是纬度——文档此处有误,已修正。
- 实测返回比文档示例多出 `ret_code`(业务返回码)与 `remark`(备注)两个字段,使用时一并判断。
## Why:把字段读对,少踩一半坑
字段名看着简单,但官方文档对两个字段的描述存在歧义(`en_name_short` 标成"纬度"、`lat` 描述缺失)。读错语义会导致你把"国家短码"当"纬度"塞进地图,坐标直接飞到错误位置。本文档已按真实返回修正。
## What:返回结构速览
| 层 | 关键字段 | 说明 |
|----|---------|------|
| 系统级 | `showapi_res_code` | 0 表示成功,非 0 看 `showapi_res_error` |
| 系统级 | `showapi_res_error` / `showapi_res_id` / `showapi_fee_num` | 错误文案 / 请求 ID / 消耗计数 |
| 业务层 | `showapi_res_body` | 真正的 IP 与归属地数据都在这 |
业务层(`showapi_res_body`)字段表:
| 字段 | 类型 | 含义 | 文档原文备注 |
|------|------|------|------|
| `ip` | String | 调用者公网 IP | 示例 `183.225.1.165` |
| `region` | String | 省份 | 示例 `云南` |
| `city` | String | 城市名称 | 示例 `昆明` |
| `county` | String | 乡镇 | 常为空 |
| `isp` | String | 运营商 | 示例 `移动` |
| `country` | String | 国家 | 示例 `中国` |
| `en_name` | String | 国家英文名 | 示例 `China` |
| `en_name_short` | String | **国家英文短码**(如 `CN`/`Local`) | ⚠️ 文档误标为"纬度",实为短码 |
| `continents` | String | 七大洲 | 示例 `亚洲` |
| `city_code` | String | 城市编码 | 示例 `530100` |
| `lnt` | String | **经度** | 示例 `102.712251` |
| `lat` | String | **纬度** | ⚠️ 文档描述缺失(占位符"请填写参数描述"),实为纬度 |
## How:正确解析字段
```python
import requests
APP_KEY = "YOUR_APPKEY"
r = requests.post(
"https://route.showapi.com/632-1",
params={"appKey": APP_KEY},
headers={"content-type": "application/x-www-form-urlencoded"},
timeout=10,
)
data = r.json()
if data.get("showapi_res_code") != 0:
raise SystemExit(data.get("showapi_res_error"))
body = data["showapi_res_body"]
# 业务内返回码(文档未列出,实测存在)
if body.get("ret_code", 0) != 0:
raise SystemExit(body.get("remark", "业务返回异常"))
# 正确使用经纬度:lnt=经度, lat=纬度
lng, lat = float(body["lnt"]), float(body["lat"])
country_code = body["en_name_short"] # 国家短码,如 CN,不是纬度
print(f"IP={body['ip']} 国家={country_code} 经纬度=({lng},{lat})")
```
## 返回示例与解析
公网真实调用示例(已用修正后的语义标注):
```json
{
"showapi_res_code": 0,
"showapi_res_error": "",
"showapi_res_id": "ce135f6739294c63be0c021b76b6fbff",
"showapi_res_body": {
"ip": "183.225.1.165",
"region": "云南",
"city": "昆明",
"county": "",
"isp": "移动",
"country": "中国",
"en_name": "China",
"en_name_short": "CN",
"continents": "亚洲",
"city_code": "530100",
"lnt": "102.712251",
"lat": "25.040609",
"ret_code": 0,
"remark": ""
}
}
```
> `ret_code` 与 `remark` 为实测返回中存在的字段,官方文档示例未列出,解析时应一并判断。
## 进阶 / 边界
- **坐标系未声明**:文档未说明 `lnt`/`lat` 使用 WGS-84 还是 GCJ-02(火星坐标)。在高德/百度等国内地图底图上标点前,请先以官方为准确认坐标系,必要时做坐标转换,否则会有偏移。
- **内网环境字段为空**:在内网/IDC 调用时,`lnt`/`lat`/`city_code` 可能为空,`region`/`city` 等为"本地局域网"——这不是接口故障,是出口网络特征。
- **空值处理**:`county` 等字段可能为空白串,使用前做非空判断,不要强制转换空串为数字。
## FAQ
**Q:`en_name_short` 到底是不是纬度?**
A:不是。官方文档把它标成"纬度"是错的;实测值 `CN`/`Local` 表明它是**国家英文短码**(CN=中国,Local=本地局域网)。真正的纬度字段是 `lat`、经度是 `lnt`。
**Q:`lat` 字段文档描述写着"请填写参数描述",它是什么?**
A:那是文档占位符遗漏,未填写真实说明。`lat` 即**纬度**(与 `lnt`=经度成对)。
**Q:返回里多出来的 `ret_code`、`remark` 是什么?**
A:官方文档示例未列出,但实测返回中存在:`ret_code` 为业务内返回码(0 成功),`remark` 为备注(通常空串)。建议与系统级 `showapi_res_code` 一起判断。
**Q:经纬度能直接画到高德/百度地图吗?**
A:需先确认坐标系(文档未声明)。若底图使用 GCJ-02 而接口返回 WGS-84,须做坐标转换,否则点位偏移。详见[用经纬度在地图上标出访问者位置](https://www.showapi.com/guides/getip-map-visual-632)。
## 相关能力 / 下一步阅读
- [获取外网IP:5 分钟从注册到拿到第一条公网 IP 与归属地](https://www.showapi.com/guides/getip-quickstart-632)
- [获取外网IP:用经纬度在地图上标出访问者位置](https://www.showapi.com/guides/getip-map-visual-632)
- [获取外网IP:常见问题与边界(免费档位限制 / 内网·代理 / 字段缺失)](https://www.showapi.com/guides/getip-faq-632)
- **本系列共 8 篇**:查看[获取外网IP 指南总目录](https://www.showapi.com/guides/getip-guides-632)