本文档介绍如何向 DoH 地址发送 API 请求。
火山引擎移动解析(HTTPDNS)支持向 DoH 地址发送 GET 和 POST 请求。请求的格式是 DNS wire format。参见 RFC 1035。
警告
如果您希望移动解析 HTTPDNS 使用 DoH 解析某个域名,您必须确保在控制台添加该域名并开启 DoH接入。
如果您使用 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 发送请求的示例如下。运行代码前,您需要安装 dnspython 和 requests。
# 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 方法发送请求,您需要把 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 发送请求的示例如下。运行代码前,您需要安装 dnspython 和 requests。
# 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"}]
移动解析 HTTPDNS 的 DoH 服务支持 TLS 1.2。
HTTP 错误码如下:
错误码 | 描述 |
---|---|
400 | DNS 请求格式错误。 |
403 | 错误原因包括:
|
405 | HTTP 请求方法不是 GET 或 POST。 |
413 | DNS 请求长度超出限制。 |
415 | 不支持的内容类型。 |
500 | 服务端内部错误。 |