C SDK を使用した統合、初期化、名前解決の完全なワークフローについては、すでにご理解いただけたことと思います。このトピックでは、HTTPDNS C SDK の解決結果を、Qt アプリケーションで QNetworkAccessManager によって行われるネットワークリクエストに適用する方法について説明します。
1. 背景情報
QNetworkAccessManager は、HTTP および HTTPS リクエストを送信するための Qt のコアネットワークモジュールです。これは、Qt アプリケーションでネットワークリクエストを行う最も一般的な方法です。このトピックでは、QNetworkAccessManager を使用する Qt アプリケーションに HTTPDNS C SDK を統合する方法について説明します。Qt WebEngine (WebView シナリオ) を使用する場合は、「DoH と Qt WebEngine の統合」をご参照ください。
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 ヘッダーの設定と 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 ヘッダーを元のドメイン名に設定したままにする
req.setPeerVerifyName(originalHost); // 元のドメイン名に対して HTTPS 証明書を検証
// リクエストの送信
QNetworkAccessManager manager;
QNetworkReply *reply = manager.get(req);4. まとめ
QNetworkAccessManager を使用する Qt アプリケーションに HTTPDNS C SDK を統合するには、URL 内のドメイン名を解決済みの IP アドレスに置き換える、Host ヘッダーを設定する、証明書検証ドメイン名を設定するという 3 つの主要なステップに従います。このソリューションは実装が簡単です。setPeerVerifyName を使用して、HTTPS の SNI と証明書検証を正しく処理します。証明書検証をスキップしたり無視したりする必要はありません。