从报错到修复:DNS记录查询API的常见错误与排查手册
2026/7/17 14:09:42 网站建设 项目流程

适用场景与接口价值

在日常开发与运维中,DNS 记录查询是排查域名配置、邮件路由、CDN 切换、TLS 证书签发等问题的基本功。单独使用dignslookup固然可行,但在自动化脚本、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)。名称大小写敏感?根据实际接口反馈,Aa可能被识别为不同值,建议统一使用大写或数字编码,避免歧义。

请求参数与鉴权

接口方法是 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 规范推测,真实错误码请以接口返回的codemsg为准。排错时应始终优先读取msg字段。

常见错误与排错步骤

1. 请求参数缺失或格式错误

现象code: 1msg: "host is required"或类似。

排查方法

  • 确认host参数未遗漏,且已被 URL 编码(非 ASCII 域名需 encode)。
  • 检查type参数值是否属于支持列表。大小写:建议使用大写(如MX)或数字(如15)。若用mx小写,接口可能拒绝。
  • 使用curl -v查看实际发送的 URL,确认无多余空格或换行。

修复:规范入参,使用脚本生成 URL 时用—data-urlencode或 URL 编码函数。

2. 域名解析失败(域名不存在或无法解析)

现象code: 2msg: "domain not found";或成功但records为空数组。

排查方法

  • 先用dig A example.comnslookup 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。使用pingtcping(宝塔面板等)检查连通性。
  • 若处于内网或受限网络,可能需配置代理。例如通过curl --proxy http://proxy:port测试。
  • 如果偶发性空回复,可能是服务器临时过载,重试即可。

修复:配置代理环境变量HTTP_PROXYHTTPS_PROXY;代码中设置connectTimeout为 5s、readTimeout为 10s,避免长时间挂死。

5. 类型参数type与预期不符

现象:成功返回但记录类型不是请求的类型(例如请求MX却返回了A记录)。

排查方法:检查请求 URL 中type是否拼写错误(如Mx不是MX)。接口对于不识别的大小写可能回退到默认A

修复:强制使用大写或数字编码,并在代码中将type值标准化(如.toUpperCase()或映射表)。

工程化注意事项

  1. 缓存 TTL:每条记录都携带ttl(秒)。对于高频查询的域名(如监控),建议在客户端按ttl缓存,减少 API 调用量。注意不同源可能返回不同 TTL,取最小值较为保守。

  2. 多类型异步查询:如需同时获取 A 和 MX 记录,可并行发送两个请求,或直接使用type=ANY一次获取所有类型。但 ANY 返回的数据量较大,解析时应按type字段过滤。

  3. 重试策略:对于code: 3(限流)或网络超时,采用指数退避重试。对于code: 1(参数错误)则不要重试,直接记录日志并报警。

  4. 日志记录:每次请求记录request_idexec_mscode。若排查问题时需要提交工单,必须提供request_id以便服务方定位。

  5. 边缘情况:域名含国际化域名(IDN)应先转换为 Punycode(如中文.comxn--...com),接口虽能自动处理,但手动转换更可靠。IP 地址(如8.8.8.8)理论上无 DNS 记录,传参会得到空结果或错误,应提前过滤。

参考文档

  • DNS 记录查询 API 原始文档
  • API 文档页

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询