获取外网IP:常见问题与边界(免费档位限制 / 内网·代理 / 字段缺失)
# 获取外网IP:常见问题与边界(免费档位限制 / 内网·代理 / 字段缺失)
> 接口:获取外网IP(apiCode 632,接入点 1) · 免费 · POST/GET · JSON · 适用:已接入用户 · 阅读约 6 分钟
## 核心要点
- 接口**免费**但设使用档位限制防滥用,高并发请先看档位说明,必要时用积分升档。
- 内网/IDC/代理出口下返回"本地局域网"或内网 IP,属正常表现,不是故障。
- 字段以真实返回为准:经纬度是 `lnt`/`lat`,`en_name_short` 是国家短码;`ret_code`/`remark` 为实测多出的字段。
## Why:先看清边界,少提工单
这个接口用起来极简单,但"简单"也容易让人对返回结果产生误解:为什么拿到的是内网 IP?为什么坐标是空的?为什么文档写的字段和实际不一样?本文把这些高频疑问一次说清。
## What:你需要知道的边界清单
| 边界 | 事实 |
|------|------|
| 计费 | 免费,注册后默认可调用;设使用档位限制,可用积分兑换更高档位 |
| 参数 | 无业务参数,只需 AppKey 鉴权 |
| 状态码 | 仅系统级 `showapi_res_code` + 业务内 `ret_code`(实测),无生命周期枚举 |
| 坐标系 | 文档未声明,国内底图标点前需确认 |
## How:常见场景的处理方式
### 场景一 · 免费档位不够用
免费接口设使用档位限制。若返回档位不足类错误,到[免费接口档位说明](https://www.showapi.com/free-api)查看当前档位,用平台积分兑换更高档位;批量场景用缓存减少重复调用(见[地域分布分析](https://www.showapi.com/guides/getip-geo-analysis-632))。
### 场景二 · 拿到"本地局域网"而非真实公网 IP
说明请求从内网/IDC 出口发出。要拿终端用户公网 IP,应由**你的服务端在收到用户请求时调用**,而非在前端或内网机器直接调。
```python
# 服务端视角:拿到的是调用方(你的服务)出口 IP;
# 要拿终端用户 IP,改用用户请求里的 X-Forwarded-For / 真实客户端 IP 作为上下文。
import requests
APP_KEY = "YOUR_APPKEY"
r = requests.post("https://route.showapi.com/632-1", params={"appKey": APP_KEY}, timeout=10)
print(r.json()["showapi_res_body"].get("ip"))
```
### 场景三 · 字段为空 / 文档描述对不上
以真实返回为准:`lat` 是纬度、`lnt` 是经度、`en_name_short` 是国家短码;`ret_code`/`remark` 为实测返回中存在的字段。完整对照见[返回字段全解](https://www.showapi.com/guides/getip-fields-632)。
## 返回示例与解析
内网环境实测返回(与文档公网示例不同,属正常):
```json
{
"showapi_res_code": 0,
"showapi_fee_num": 1,
"showapi_res_body": {
"ip": "172.16.7.249",
"region": "本地局域网",
"city": "本地局域网",
"county": "本地局域网",
"country": "本地局域网",
"en_name": "Local",
"en_name_short": "Local",
"continents": "本地局域网",
"lnt": "",
"lat": "",
"city_code": "",
"isp": "",
"ret_code": 0,
"remark": ""
}
}
```
> 内网出口下 `region`/`city` 等为"本地局域网"、经纬度为空,是出口网络特征,不代表接口异常。
## 进阶 / 边界
- **代理/VPN 偏移**:用户经代理或 VPN 出口时,属地显示为出口所在,不等于用户真实位置,业务判断需留余地。
- **不要硬编码字段顺序**:返回字段顺序可能变化,按字段名取值而非下标。
- **错误降级**:任何调用失败都应降级(记日志 + 不阻断主流程),不要把 IP 查询设为强依赖。
## FAQ
**Q:这个接口真的完全免费吗?**
A:接口本身免费,注册即默认可调用;但设使用档位限制防滥用,高并发/大流量需看档位并用积分升档。
**Q:为什么我拿到内网 IP 而不是用户公网 IP?**
A:因为是你(或内网机器)直接调的,接口只能看到调用方出口。要拿终端用户公网 IP,需由你的服务端在用户请求上下文里调用,或结合用户真实客户端 IP。
**Q:`en_name_short` 是纬度吗?文档这么写的。**
A:不是,文档此处有误。它是国家英文短码(CN/Local),纬度字段是 `lat`、经度是 `lnt`。
**Q:返回里多了 `ret_code`、`remark`,要处理吗?**
A:是实测真实存在的字段。建议与 `showapi_res_code` 一起判断:`showapi_res_code==0` 且 `ret_code==0` 视为成功。
**Q:能用于生产高并发风控吗?**
A:可以,但需评估档位、做异步化与降级、并缓存回访用户属地,避免把免费接口当强依赖拖垮主流程。
## 相关能力 / 下一步阅读
- [获取外网IP:返回字段全解(IP / 经纬度 / 归属地 / 运营商)](https://www.showapi.com/guides/getip-fields-632)
- [获取外网IP:5 分钟从注册到拿到第一条公网 IP 与归属地](https://www.showapi.com/guides/getip-quickstart-632)
- [获取外网IP:登录安全与异常地域风控场景集成指南](https://www.showapi.com/guides/getip-login-audit-632)
- **本系列共 8 篇**:查看[获取外网IP 指南总目录](https://www.showapi.com/guides/getip-guides-632)