返回经验列表
APIUSPS开发实战地址验证

USPS 地址验证 API 接入实战:从注册到生产环境部署

Petmind2026-07-2112分钟阅读

USPS 地址验证 API 接入实战

USPS (United States Postal Service) 提供了一套完整的地址验证 API,包括 Address Verification、ZIP Code Lookup 和 City/State Lookup 等接口。对于需要处理美国地址的电商、物流和表单系统来说,这是最直接、最权威的验证方案。

注册与获取 API 密钥

1. 创建 USPS 开发者账号

访问 USPS Web Tools 官网,点击 "Register" 注册开发者账号。注册过程免费,不需要信用卡。

2. 获取测试 API Key

注册成功后,系统会自动生成一个测试环境的 API Key(通常以 Username 形式提供)。USPS 的 Web Tools 使用 HTTP Basic Auth,用户名就是你的 API Key,密码可以留空。

3. 申请生产环境权限

测试环境默认有访问限制(约 1000 次/天)。如果业务需要更高的调用量,需要提交生产环境申请,说明使用场景和预计调用量。

API 接口详解

USPS 提供 SOAP 和 REST 两种接口格式。推荐使用 REST API,更易于集成。

地址验证接口 (Verify)

验证地址的有效性并返回标准化后的地址。

```http

POST https://secure.shippingapis.com/ShippingAPI.dll?API=Verify&XML=<AddressValidateRequest USERID="YOUR_USER_ID">

<Address ID="0">

<Address1>Suite 100</Address1>

<Address2>123 Main St</Address2>

<City>Los Angeles</City>

<State>CA</State>

<Zip5>90001</Zip5>

<Zip4></Zip4>

</Address>

</AddressValidateRequest>

```

Python 接入示例

```python

import requests

import xml.etree.ElementTree as ET

USPS_USER_ID = "YOUR_USER_ID"

USPS_API_URL = "https://secure.shippingapis.com/ShippingAPI.dll"

def verify_address(address1, address2, city, state, zip5):

"""调用 USPS API 验证地址"""

xml_payload = f"""<AddressValidateRequest USERID="{USPS_USER_ID}">

<Address ID="0">

<Address1>{address1 or ''}</Address1>

<Address2>{address2}</Address2>

<City>{city}</City>

<State>{state}</State>

<Zip5>{zip5}</Zip5>

<Zip4></Zip4>

</Address>

</AddressValidateRequest>"""

params = {

"API": "Verify",

"XML": xml_payload

}

response = requests.get(USPS_API_URL, params=params, timeout=10)

if response.status_code == 200:

root = ET.fromstring(response.content)

# 解析返回结果

address = root.find(".//Address")

if address is not None:

return {

"address1": address.findtext("Address1", ""),

"address2": address.findtext("Address2", ""),

"city": address.findtext("City", ""),

"state": address.findtext("State", ""),

"zip5": address.findtext("Zip5", ""),

"zip4": address.findtext("Zip4", ""),

"delivery_point": address.findtext("DeliveryPoint", ""),

}

return None

使用示例

result = verify_address(

address1="",

address2="1600 Pennsylvania Ave NW",

city="Washington",

state="DC",

zip5="20500"

)

print(result)

```

Node.js 接入示例

```javascript

const axios = require('axios');

const { parseStringPromise } = require('xml2js');

const USPS_USER_ID = process.env.USPS_USER_ID;

const USPS_API_URL = 'https://secure.shippingapis.com/ShippingAPI.dll';

async function verifyAddress(address) {

const xmlPayload = '<AddressValidateRequest USERID="' + USPS_USER_ID + '">'

+ '<Address ID="0">'

+ '<Address1>' + (address.address1 || '') + '</Address1>'

+ '<Address2>' + address.address2 + '</Address2>'

+ '<City>' + address.city + '</City>'

+ '<State>' + address.state + '</State>'

+ '<Zip5>' + address.zip5 + '</Zip5>'

+ '<Zip4></Zip4>'

+ '</Address>'

+ '</AddressValidateRequest>';

try {

const response = await axios.get(USPS_API_URL, {

params: { API: 'Verify', XML: xmlPayload },

timeout: 10000

});

const parsed = await parseStringPromise(response.data);

const addr = parsed.AddressValidateResponse?.Address?.[0];

return {

address1: addr?.Address1?.[0] || '',

address2: addr?.Address2?.[0] || '',

city: addr?.City?.[0] || '',

state: addr?.State?.[0] || '',

zip5: addr?.Zip5?.[0] || '',

zip4: addr?.Zip4?.[0] || '',

validated: !!addr?.Zip5?.[0]

};

} catch (error) {

console.error('USPS API Error:', error.message);

return null;

}

}

module.exports = { verifyAddress };

```

生产环境集成方案

1. 缓存策略

USPS API 有调用频率限制,建议对验证结果进行缓存:

缓存策略TTL适用场景
Redis 缓存24小时高并发系统
内存缓存1小时中小规模应用
本地文件缓存持久化开发测试环境

2. 错误处理与降级

```python

class AddressValidator:

def __init__(self):

self.usps_client = USPSClient()

self.cache = RedisCache()

async def validate(self, address):

cache_key = self._build_cache_key(address)

# 先查缓存

cached = await self.cache.get(cache_key)

if cached:

return cached

try:

# 调用 USPS API

result = await self.usps_client.verify(address)

await self.cache.set(cache_key, result, ttl=86400)

return result

except USPSAPIError:

# 降级:使用本地规则校验

return self._fallback_validation(address)

def _fallback_validation(self, address):

"""USPS API 不可用时,使用本地正则进行基础校验"""

return {

"validated": False,

"zip_valid": bool(re.match(r'^\d{5}(-\d{4})?$', address.get('zip', ''))),

"state_valid": address.get('state') in STATE_LIST,

"note": "USPS API 暂时不可用,仅进行了基础格式校验"

}

```

3. 性能优化

优化手段效果实现复杂度
批量验证减少 60% API 调用中等
异步调用降低响应延迟
连接池减少 TCP 握手开销
预验证过滤排除明显错误的地址

常见问题与解决方案

Q: API 返回 "Authorization failure"

A: 检查 API Key 是否正确,USPS 测试环境和生产环境的 Key 不同。

Q: 验证通过的地址仍然有投递问题

A: USPS 验证的是格式和邮编匹配关系,不保证地址真实存在。对于关键业务,建议结合 Google Maps Geocoding 进行二次验证。

Q: 调用频率受限

A: 测试环境限制 1000 次/天。申请生产环境权限后可提升至 10,000 次/天或更高。

总结

USPS 地址验证 API 是处理美国地址最权威的方案。通过合理的缓存策略、错误降级和性能优化,可以在生产环境中稳定运行。对于需要高可用性的系统,建议同时集成 USPS API 和本地校验规则作为兜底方案。

返回经验列表