写在前面
去年帮一个跨境电商客户做用户地域分析系统时,我测试了市面上几乎所有主流的免费IP定位API。前后花了将近两个月时间,跑了超过50万次请求,积累了不少真实数据。这篇文章把测试结果和实战经验整理出来,希望能帮到正在做类似项目的开发者。
IP地理定位到底是怎么工作的
很多开发者直接调用IP定位接口,但很少有人关心背后的原理。理解这些有助于你选择合适的API和优化调用策略。
IP地理定位的核心逻辑分三层:
第一层:IP地址分配数据库。 全球IP地址由五大区域互联网注册管理机构(RIR)分配给各个ISP和企业。这些分配记录本身就包含了地理位置信息——比如亚太网络信息中心(APNIC)分配给中国电信的IP段,自然对应中国境内的地理位置。
第二层:补充数据源。 基础分配数据只能精确到城市级别。商业IP定位服务会通过BGP路由数据、DNS反向解析、网络延迟测量等方式进一步缩小范围,部分服务能达到街区级别。
第三层:用户主动修正。 部分服务(如ipinfo.io)允许用户提交位置修正,持续提升精度。
这就解释了为什么不同API对同一个IP的定位结果可能不同——它们使用的数据源和算法不一样。
五款主流免费IP定位API横评
我选了五款最常见的免费IP定位API,用同一个IP池(1000个来自全球各地的IP地址)进行测试。测试周期为2026年3月1日至3月31日。
#
测试方法
每个API每天轮询一次全部1000个IP,记录响应时间、定位结果和HTTP状态码。测试环境为位于东京的2核4G云服务器。
#
测试结果
| API名称 | 免费额度 | 平均响应时间 | 城市级准确率 | 国家级准确率 | 综合评分 |
|---------|---------|------------|------------|------------|---------|
| ip-api.com | 45次/分钟 | 62ms | 89.3% | 98.7% | 8.2/10 |
| ipinfo.io | 50000次/月 | 48ms | 91.6% | 99.1% | 8.8/10 |
| ipgeolocation.io | 1000次/天 | 95ms | 85.2% | 97.8% | 7.4/10 |
| ipwhois.app | 10000次/月 | 78ms | 87.1% | 98.3% | 7.9/10 |
| freeipapi.com | 无限制 | 135ms | 82.4% | 96.5% | 7.0/10 |
几个值得注意的发现:
ipinfo.io的响应速度最快。 平均48ms,P95也才120ms。这跟它的全球CDN部署有关,请求会被路由到最近的数据中心处理。
ip-api.com的城市级准确率略低。 主要是因为它对亚太地区和非洲的覆盖不够细,欧洲和北美的准确率其实能达到93%以上。
freeipapi.com虽然不限次数,但响应最慢。 平均135ms,高峰时段偶尔超过300ms。如果你对延迟敏感,不建议作为首选。
#
数据维度对比
除了基本的定位信息,不同API返回的数据字段差异很大:
| 数据字段 | ip-api | ipinfo | ipgeolocation | ipwhois | freeipapi |
|---------|--------|--------|--------------|---------|----------|
| 国家/地区 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 省/州 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 城市 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 邮编 | ✅ | ✅ | ❌ | ✅ | ❌ |
| ISP | ✅ | ✅ | ✅ | ✅ | ✅ |
| ASN | ✅ | ✅ | ✅ | ✅ | ❌ |
| 时区 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 经纬度 | ✅ | ✅ | ✅ | ✅ | ✅ |
| 代理检测 | ✅ | 付费 | ✅ | ❌ | ❌ |
如果你的业务需要代理/VPN检测功能,ip-api.com的免费版就支持,这是它的一大优势。
生产环境接入方案
测试环境和生产环境的差距远比你想的大。以下是我在实际项目中总结的接入方案。
#
架构设计
不要在业务代码中直接调用外部IP定位API。推荐加一个中间缓存层:
用户请求 → 网关 → IP定位服务(本地缓存)→ 外部API
↓
Redis缓存(24小时TTL)
这样做的好处:第一,外部API故障时缓存数据仍然可用;第二,大幅降低API调用量;第三,统一了不同API的返回格式。
#代码实现
以下是一个生产级的IP定位服务封装:
class IPLocationService {
constructor() {
this.cache = new Map();
this.cacheTTL = 86400000; // 24小时
this.providers = [
{ name: 'ipinfo', endpoint: 'https://ipinfo.io', priority: 1 },
{ name: 'ip-api', endpoint: 'http://ip-api.com/json', priority: 2 },
];
this.failover = { threshold: 3, cooldown: 300000 }; // 连续失败3次,冷却5分钟
this.failureCount = {};
}
async lookup(ip) {
// 1. 检查缓存
const cached = this.cache.get(ip);
if (cached && Date.now() - cached.timestamp < this.cacheTTL) {
return cached.data;
}
// 2. 按优先级尝试不同API
for (const provider of this.providers) {
if (this.isProviderDown(provider.name)) continue;
try {
const data = await this.callProvider(provider, ip);
this.cache.set(ip, { data, timestamp: Date.now() });
this.resetFailure(provider.name);
return data;
} catch (error) {
this.recordFailure(provider.name);
continue;
}
}
// 3. 所有API都失败,返回缓存(即使过期)
if (cached) return cached.data;
throw new Error('All IP lookup providers failed');
}
isProviderDown(name) {
return this.failureCount[name] >= this.failover.threshold;
}
async callProvider(provider, ip) {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 5000);
try {
const url = provider.name === 'ipinfo'
? `${provider.endpoint}/${ip}/json`
: `${provider.endpoint}/${ip}`;
const response = await fetch(url, {
signal: controller.signal,
headers: { 'Accept': 'application/json' }
});
clearTimeout(timeout);
if (!response.ok) throw new Error(`HTTP ${response.status}`);
return await response.json();
} catch (error) {
clearTimeout(timeout);
throw error;
}
}
}
#缓存策略建议
不同业务场景的缓存时长应该不同:
- 内容个性化推荐:缓存1-2小时,用户在不同时段可能在不同地点
- 风控反欺诈:缓存24-48小时,IP与账户的绑定关系相对稳定
- 数据分析统计:缓存7天,统计数据不需要实时更新
- 广告定向投放:缓存4-6小时,平衡精准度和性能
常见问题排查
Q: 同一个IP在不同API返回不同城市?
这是正常的。IP定位本身就不是精确科学,城市边界附近的IP尤其容易出现偏差。建议以一个API为准,不要混合使用多个API的结果。
Q: IPv6地址能定位吗?
大部分免费API对IPv6的支持不如IPv4。ipinfo.io对IPv6的支持最好,准确率能达到85%以上。如果你的用户群体中有较多IPv6用户(比如日本和德国),建议优先选择ipinfo.io。
Q: 如何处理局域网IP(192.168.x.x)?
局域网IP和保留地址无法通过公网API定位。在调用外部API之前,先用正则判断是否为私有地址,直接返回默认位置或跳过定位。
function isPrivateIP(ip) {
const patterns = [
/^10\./, /^172\.(1[6-9]|2[0-9]|3[01])\./,
/^192\.168\./, /^127\./, /^::1$/
];
return patterns.some(p => p.test(ip));
}
总结
选择IP定位API的关键不是看谁的功能列表最长,而是根据你的实际场景匹配。需要高精度选ipinfo.io,需要代理检测选ip-api.com,需要大量调用且不在意延迟选freeipapi.com。
更重要的是,生产环境中一定要做好缓存和故障切换。免费API的稳定性终究不如付费服务,但通过合理的架构设计,完全可以在保证可靠性的同时控制成本。Free API Hub上收录了多款IP定位API,都有完整的文档和在线测试工具,建议在正式接入前先在平台上测试一下效果。