适用场景与接口价值
在日常开发与运维中,DNS 记录查询是排查域名配置、邮件路由、CDN 切换、TLS 证书签发等问题的基本功。单独使用dig或nslookup固然可行,但在自动化脚本、CI/CD 流程、多云的集中管理场景下,一个结构化的 RESTful API 能显著提升效率。
本接口(DNS 记录查询)提供了 A、AAAA、NS、CNAME、MX、TXT、CAA、SOA 八种标准记录类型,以及一次性获取所有类型的 ANY 模式。其内部聚合了 AliDNS、DNSPod、360 三家国内 DoH 源,返回时会对多条记录去重,并标注每条记录的来源(sources 字段),便于跨供应商比对。
然而,任何 API 在生产中都会遇到各种调用异常。本文将从排错角度,逐一分析该接口使用中可能遇到的错误类型、判断依据和修复方法,让你不再对着一个curl: (52) Empty reply from server束手无策。
接口能力与边界
在深入错误之前,先明确接口的“可接受”范围:
- QPS:10 请求/秒。超出后可能返回限流错误(HTTP 429 或业务错误码)。
- 鉴权:可选。不传
X-API-Key走匿名额度,但额度有限;建议线上使用固定 API Key,避免因匿名耗尽而中断。 - 域名自动清洗:接口会剥离
http://、https://、路径、端口,只取纯净域名。但传空字符串、纯 IP 或不合法的域名格式会触发错误。 - 类型参数:支持名称(如 A、AAAA、MX)和数字编码(1、15、16)。名称大小写敏感?根据实际接口反馈,
A和a可能被识别为不同值,建议统一使用大写或数字编码,避免歧义。
请求参数与鉴权
接口方法是 GET,URL 固定为https://v1.apizero.cn/api/dns-query。
必填参数host
- 域名,字符串。
- 示例:
example.com(合法);http://example.com/path虽然会被自动清理,但若附加了多余字符,可能因编码问题导致解析失败。
可选参数type
- 默认
A。 - 允许值:
A,AAAA,NS,CNAME,MX,TXT,CAA,SOA,ANY或其对应数字:1, 2, 5, 6, 15, 16, 28, 257。 - 若填写不支持的字符串(如
SRV),或拼写错误,接口将返回参数非法错误。
Header 可选X-API-Key
- 若使用匿名额度,无需此头。
- 若使用 API Key,务必确保未泄露,且令牌有效。
可复制的 curl 示例
# 匿名查询(额度有限) curl -sS -X GET "https://v1.apizero.cn/api/dns-query?host=baidu.com&type=A" # 带 API Key 查询 MX 记录(替换 $YOUR_API_KEY) curl -sS -X GET \ -H "X-API-Key: $YOUR_API_KEY" \ "https://v1.apizero.cn/api/dns-query?host=baidu.com&type=MX"建议先跑匿名版确认基础通路,再引入鉴权。
返回值结构与常见状态码
成功响应结构(HTTP 200):
{ "code": 0, "data": { "exec_ms": 234, "host": "baidu.com", "input": "baidu.com", "notes": null, "records": [ // 每条记录含 data, name, parsed, sources, ttl, type, type_code ], "sources": ["alidns", "china360", "dnspod"], "total": 2, "type": "MX", "type_code": 15 }, "msg": "成功", "request_id": "mota..." }错误时,code非 0,且msg给出原因。根据接口文档及常见 DoH API 设计,错误码大致如下(具体以实际返回为准):
| code | 含义 | 处理建议 |
|---|---|---|
| 1 | 参数错误(host 为空、type 非法等) | 检查入参格式和类型值 |
| 2 | 查询失败(域名不存在、DNS 解析内部错误) | 验证域名有效性,或稍后重试 |
| 3 | 限流或鉴权失败 | 降低请求频率,检查 API Key 是否过期 |
| -1 | 系统内部错误 | 携带request_id联系技术支持 |
注:以上错误码系根据通用 API 规范推测,真实错误码请以接口返回的
code和msg为准。排错时应始终优先读取msg字段。
常见错误与排错步骤
1. 请求参数缺失或格式错误
现象:code: 1,msg: "host is required"或类似。
排查方法:
- 确认
host参数未遗漏,且已被 URL 编码(非 ASCII 域名需 encode)。 - 检查
type参数值是否属于支持列表。大小写:建议使用大写(如MX)或数字(如15)。若用mx小写,接口可能拒绝。 - 使用
curl -v查看实际发送的 URL,确认无多余空格或换行。
修复:规范入参,使用脚本生成 URL 时用—data-urlencode或 URL 编码函数。
2. 域名解析失败(域名不存在或无法解析)
现象:code: 2,msg: "domain not found";或成功但records为空数组。
排查方法:
- 先用
dig A example.com或nslookup example.com确认域名在公共 DNS 上是否有记录。 - 若自有域名,检查 DNS 配置是否生效,TTL 是否已过。
- 观察接口返回的
sources字段是否缺失某个源:若china360缺失,说明该 DoH 对域名无记录,但聚合结果仍可参考。
修复:确认域名正确后,可降低请求频率(因部分 DoH 有短时缓存抖动),或换ANY类型全量拉取再过滤。
3. 鉴权与限流异常
现象:
- 无 API Key 时突然返回
code: 3或 HTTP 403/429。 - 带 API Key 后依然返回鉴权失败。
排查方法:
- 检查
X-API-Key头部是否准确传递。使用curl -H时注意无多余引号。 - 匿名额度通常有每小时或每日上限。若频繁测试后遇到限流,可等待几分钟再试,或正式启用 API Key。
- 查看
request_id,对照文档确认该 Key 是否被禁用。
修复:申请持久 API Key 并妥善保管;在代码中加入指数退避重试(最多 3 次),重试间隔 1s、2s、4s。
4. 网络层错误:连接拒绝、超时、空回复
现象:curl: (7) Failed to connect to v1.apizero.cn port 443: Connection refused或(28) Operation timed out。
排查方法:
- 验证本地网络能否正常访问
v1.apizero.cn。使用ping或tcping(宝塔面板等)检查连通性。 - 若处于内网或受限网络,可能需配置代理。例如通过
curl --proxy http://proxy:port测试。 - 如果偶发性空回复,可能是服务器临时过载,重试即可。
修复:配置代理环境变量HTTP_PROXY、HTTPS_PROXY;代码中设置connectTimeout为 5s、readTimeout为 10s,避免长时间挂死。
5. 类型参数type与预期不符
现象:成功返回但记录类型不是请求的类型(例如请求MX却返回了A记录)。
排查方法:检查请求 URL 中type是否拼写错误(如Mx不是MX)。接口对于不识别的大小写可能回退到默认A。
修复:强制使用大写或数字编码,并在代码中将type值标准化(如.toUpperCase()或映射表)。
工程化注意事项
缓存 TTL:每条记录都携带
ttl(秒)。对于高频查询的域名(如监控),建议在客户端按ttl缓存,减少 API 调用量。注意不同源可能返回不同 TTL,取最小值较为保守。多类型异步查询:如需同时获取 A 和 MX 记录,可并行发送两个请求,或直接使用
type=ANY一次获取所有类型。但 ANY 返回的数据量较大,解析时应按type字段过滤。重试策略:对于
code: 3(限流)或网络超时,采用指数退避重试。对于code: 1(参数错误)则不要重试,直接记录日志并报警。日志记录:每次请求记录
request_id、exec_ms和code。若排查问题时需要提交工单,必须提供request_id以便服务方定位。边缘情况:域名含国际化域名(IDN)应先转换为 Punycode(如
中文.com→xn--...com),接口虽能自动处理,但手动转换更可靠。IP 地址(如8.8.8.8)理论上无 DNS 记录,传参会得到空结果或错误,应提前过滤。
参考文档
- DNS 记录查询 API 原始文档
- API 文档页