You need to enable JavaScript to run this app.
导航

向 DoH 地址发送 API 请求

最近更新时间2024.03.29 17:41:10

首次发布时间2023.10.08 19:55:55

本文档介绍如何向 DoH 地址发送 API 请求。
火山引擎移动解析(HTTPDNS)支持向 DoH 地址发送 GET 和 POST 请求。请求的格式是 DNS wire format。参见 RFC 1035

前提条件

开启 DoH 并获取接入域名

警告

如果您希望移动解析 HTTPDNS 使用 DoH 解析某个域名,您必须确保在控制台添加该域名并开启 DoH接入

  • 对于没有在控制台添加的域名,解析会失败,HTTPDNS 服务端会返回 403 错误码。
  • 如果 DoH接入 没有处于开启状态,解析会失败,HTTPDNS 服务端会返回 403 错误码。

请求示例

GET 请求

如果您使用 GET 方法发送请求,您需要把 DNS 报文基于 base64 算法进行编码并加入到请求 URL 的 dns 参数中。您通过 accept 请求头把 MIME 类型设置为 application/dns-message
下面的例子展示了获取 www.example.com 的解析结果的 GET 请求:

:method = GET
:scheme = https
:authority = doh-xxxxxxxxxxxxxxx.volcdns.pub
:path = /dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB
accept = application/dns-message

使用 Python 发送请求的示例如下。运行代码前,您需要安装 dnspythonrequests

# Python 3
import dns.message
import requests
import base64
import json

doh_url = "https://doh-xxxxxxxxxxxxxxx.volcdns.pub/dns-query"
domain = "www.example.com."
rr = dns.rdatatype.A 
result = []

message = dns.message.make_query(qname=domain, rdtype=rr)
dns_req = base64.b64encode(message.to_wire()).decode("UTF8").rstrip("=")
r = requests.get(doh_url + "?dns=" + dns_req,
                 headers={"accept": "application/dns-message"})

for answer in dns.message.from_wire(r.content).answer:
    dns = answer.to_text().split()
    result.append({"Query": dns[0], "TTL": dns[1], "RR": dns[3], "Answer": dns[4]})
    print(json.dumps(result))

返回结果如下:

[{"Query": "www.example.com.", "TTL": "86230", "RR": "A", "Answer": "93.184.216.34"}]

POST 请求

如果您使用 POST 方法发送请求,您需要把 DNS 报文加入请求体中。您通过 Content-type 请求头把 MIME 类型设置为 application/dns-message。下面的例子展示了获取 www.example.com 的解析结果的 POST 请求:

:method = POST
:scheme = https
:authority = doh-xxxxxxxxxxxxxxx.volcdns.pub
:path = /dns-query
accept = application/dns-message
content-type = application/dns-message
content-length = 33

<33 bytes represented by the following hex encoding>
00 00 01 00 00 01 00 00  00 00 00 00 03 77 77 77
07 65 78 61 6d 70 6c 65  03 63 6f 6d 00 00 01 00
01

使用 Python 发送请求的示例如下。运行代码前,您需要安装 dnspythonrequests

# Python 3
import dns.message
import requests
import base64
import json

doh_url = "https://doh-xxxxxxxxxxxxxxx.volcdns.pub/dns-query"
domain = "www.example.com."
rr = dns.rdatatype.A 
result = []

message = dns.message.make_query(qname=domain, rdtype=rr)
dns_req = message.to_wire()
r = requests.post(url=doh_url,
                 headers={"Content-type": "application/dns-message"},
                 data= dns_req
)

for answer in dns.message.from_wire(r.content).answer:
    dns = answer.to_text().split()
    result.append({"Query": dns[0], "TTL": dns[1], "RR": dns[3], "Answer": dns[4]})
    print(json.dumps(result))

返回结果如下:

[{"Query": "www.example.com.", "TTL": "85247", "RR": "A", "Answer": "93.184.216.34"}]

支持的 TLS 版本

移动解析 HTTPDNS 的 DoH 服务支持 TLS 1.2。

错误码

HTTP 错误码如下:

错误码

描述

400

DNS 请求格式错误。

403

错误原因包括:

405

HTTP 请求方法不是 GET 或 POST。

413

DNS 请求长度超出限制。

415

不支持的内容类型。

500

服务端内部错误。