网络错误
网络错误是指客户端在连接服务器过程中遇到的问题,通常与网络配置、代理设置或 DNS 解析有关。
常见网络错误
| 错误码 | 错误名称 | 说明 |
|---|---|---|
ECONNREFUSED | 连接被拒绝 | 目标地址和端口没有服务监听,或被防火墙拒绝 |
ETIMEDOUT | 连接超时 | 在规定时间内无法建立连接 |
ENOTFOUND | 域名解析失败 | 无法解析域名对应的 IP 地址 |
ECONNRESET | 连接被重置 | 连接被对端或网络设备强制关闭 |
EPIPE | 管道破裂 | 写入已关闭的连接 |
EHOSTUNREACH | 主机不可达 | 网络路由无法到达目标主机 |
原因分析
ECONNREFUSED
- Base URL 中的端口错误(如使用了 HTTP 端口而非 HTTPS 端口)
- 服务未启动或已崩溃
- 防火墙规则拒绝了连接
ETIMEDOUT
- 网络延迟过高
- 目标服务器不可达
- 本地网络问题(如 WiFi 信号差)
ENOTFOUND
- 域名拼写错误
- DNS 服务器配置问题
- 域名尚未解析生效
ECONNRESET
- 网络不稳定导致连接中断
- 服务器或中间代理主动断开连接
- 请求体过大被拦截
排查步骤
1. 检查 URL 是否正确
# 打印完整的 Base URL,检查拼写echo "$BASE_URL"
# 确认协议、域名和端口是否正确# 正确格式:https://api.example.com/v12. 检查网络连通性
# Ping 测试ping api.example.com
# 端口连通性测试nc -zv api.example.com 443
# 或使用 telnettelnet api.example.com 4433. 检查 DNS 解析
# 使用 nslookup 检查域名解析nslookup api.example.com
# 使用 dig 检查 DNS 记录dig api.example.com
# 尝试使用公共 DNS 解析dig @8.8.8.8 api.example.com4. 检查代理设置
# 查看当前代理环境变量echo $HTTP_PROXYecho $HTTPS_PROXYecho $ALL_PROXYecho $NO_PROXY5. 使用 cURL 详细模式调试
curl -v "$BASE_URL/v1/models" \ -H "Authorization: Bearer $API_KEY" 2>&1查看详细的连接过程,包括 DNS 解析、TCP 握手、TLS 协商等步骤。
解决方案
代理配置问题
如果你需要通过代理访问 API,确保正确配置代理:
# 设置 HTTP/HTTPS 代理export HTTP_PROXY="http://proxy.example.com:8080"export HTTPS_PROXY="http://proxy.example.com:8080"# Python requests 使用代理import requests
proxies = { "http": "http://proxy.example.com:8080", "https": "http://proxy.example.com:8080",}
response = requests.post( url, headers=headers, json=data, proxies=proxies, timeout=60)// JavaScript (Node.js) 使用代理const { HttpsProxyAgent } = require("https-proxy-agent");
const agent = new HttpsProxyAgent("http://proxy.example.com:8080");
fetch(url, { method: "POST", headers: headers, body: JSON.stringify(data), agent: agent,});如果你不需要代理但系统设置了代理,清除代理设置:
# 清除代理unset HTTP_PROXYunset HTTPS_PROXYunset ALL_PROXYDNS 解析问题
# 临时使用公共 DNS# 修改 /etc/resolv.conf 添加:# nameserver 8.8.8.8# nameserver 1.1.1.1或者在代码中直接指定 IP 地址(不推荐,仅用于调试):
curl --resolve api.example.com:443:<IP地址> "$BASE_URL/v1/models" \ -H "Authorization: Bearer $API_KEY"SSL/TLS 证书问题
# 临时跳过 SSL 验证(仅用于调试,不要在生产环境使用)curl -k "$BASE_URL/v1/models" -H "Authorization: Bearer $API_KEY"# Python:临时跳过 SSL 验证import requestsimport urllib3urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
response = requests.get(url, headers=headers, verify=False)防火墙和网络限制
- 确认你的网络环境是否允许访问 API 的端口(通常为 443)
- 如果在公司内网,检查是否需要配置 VPN 或白名单
- 检查本地防火墙规则是否拦截了出站请求
实现重试机制
对于偶发的网络错误,实现自动重试:
import timeimport requests
def request_with_retry(url, headers, data, max_retries=3): for attempt in range(max_retries): try: response = requests.post(url, headers=headers, json=data, timeout=60) return response except (requests.ConnectionError, requests.Timeout) as e: wait = 2 ** attempt print(f"Network error: {e}. Retrying in {wait}s...") time.sleep(wait)
raise Exception(f"Max retries ({max_retries}) exceeded")