通过 C SDK接入,您已经了解了 C SDK 的集成、初始化、域名解析的完整流程。本文主要介绍在 Qt 应用中,如何将 HTTPDNS C SDK 的解析结果应用到 QNetworkAccessManager 网络请求中。
1. 背景说明
QNetworkAccessManager 是 Qt 框架中用于发送 HTTP/HTTPS 请求的核心网络模块,是 Qt 应用中最常用的网络请求方式。本文介绍如何在使用 QNetworkAccessManager 的 Qt 应用中接入 HTTPDNS C SDK。如果您使用的是 Qt WebEngine(WebView场景),请参考Qt WebEngine接入DoH。
2. SDK 接入
SDK 的初始化、配置和域名解析的完整说明请参考C SDK接入,主要示例代码如下:
#include "hdns_api.h"
// SDK 初始化
hdns_sdk_init()
hdns_client_t *client = hdns_client_create("your_account_id", "your_secret_key");
// 客户端配置
hdns_client_set_timeout(client, 2000);
hdns_client_set_using_cache(client, true);
hdns_client_set_using_https(client, true);
hdns_client_set_using_sign(client, true);
hdns_client_enable_expired_ip(client, true);
// 启动客户端
hdns_client_start(client);
// 域名解析
hdns_list_head_t *results = NULL;
hdns_status_t status = hdns_get_result_for_host_sync_with_cache(
client, "your.domain.com", HDNS_QUERY_AUTO, NULL, &results);
char ip[HDNS_IP_ADDRESS_STRING_LENGTH];
if (hdns_status_is_ok(&status)) {
if (hdns_select_ip_randomly(results, HDNS_QUERY_AUTO, ip) == HDNS_OK) {
// 使用解析出的 ip 发起业务请求(见第 3 节)
}
}
hdns_list_cleanup(results);3. 适配 QNetworkAccessManager 请求
获取 HTTPDNS 解析结果后,需要将其应用到 QNetworkAccessManager 的请求中。由于 URL 中的域名被替换为 IP,需要额外处理 Host header 和 HTTPS 证书校验,确保服务端和 TLS 握手能正确识别原始域名。
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
QUrl url("https://your.domain.com/api/path");
QString originalHost = url.host();
// 将 URL 中的域名替换为 HTTPDNS 解析出的 IP
url.setHost(resolvedIp);
// 构造请求
QNetworkRequest req;
req.setUrl(url);
req.setRawHeader("Host", originalHost.toUtf8()); // Host header 保持原始域名
req.setPeerVerifyName(originalHost); // HTTPS 证书校验使用原始域名
// 发送请求
QNetworkAccessManager manager;
QNetworkReply *reply = manager.get(req);4. 总结
在 Qt 应用中通过 QNetworkAccessManager 接入 HTTPDNS C SDK,核心适配逻辑只需三步:替换 URL 中的域名为 IP、设置 Host header、设置证书校验域名。该方案实现简单,且通过 setPeerVerifyName 正确处理了 HTTPS 场景下的 SNI 和证书校验,无需跳过或忽略证书验证。
该文章对您有帮助吗?