帮你快速理解、总结文档立即下载

HarmonyOS SDK 接入

最近更新时间:2025-07-16 10:59:22
我的收藏

概述

移动解析 HTTPDNS 的主要功能是为了有效避免由于运营商传统 LocalDNS 解析导致的无法访问最佳接入点的方案。原理为使用 HTTP 加密协议替代传统的 DNS 协议,整个过程不使用域名,大大减少劫持的可能性。

前期准备

1. 开通移动解析 HTTPDNS 服务,详情请参见 开通移动解析 HTTPDNS。
2. 服务开通后,您需在移动解析 HTTPDNS 控制台添加解析域名才可正常使用,详情请参见 添加域名。

安装包

SDK 集成

在 HarmonyOS 应用根目录执行以下命令安装 SDK:
ohpm install @tencentcloud/httpdns
说明:
ohpm工具及更多关于OpenHarmony安装第三方 SDK 的信息请参见 OpenHarmony 三方库中心仓说明。

SDK 初始化

在 Ability onCreate 生命周期回调中执行以下代码配置 SDK:
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { httpdns, EncryptType } from "@tencentcloud/httpdns";

const DNS_ID = '这里需要替换为腾讯云HTTPDNS控制台的授权ID';
const DES_KEY = '这里需要替换为腾讯云HTTPDNS控制台的DES加密Key';

export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
httpdns.getInstance().initConfig({
context: this.context,
dnsId: DNS_ID,
dnsKey: DES_KEY,
encryptType: EncryptType.DES,
debug: true,
});
// 预解析功能,预解析www.qq.com
// httpdns.getInstance().setPreResolvedDomains(['www.qq.com']);
// 省略其他代码
}
}

SDK 使用

addCustomDnsRule 方式

在发起网络请求之前,调用 SDK 的域名解析 API 进行 HTTPDNS 解析,通过 connection.addCustomDnsRule API 配置 HTTPDNS 的解析结果,为当前应用程序添加自定义 host 和对应的 IP 地址的映射。以 HTTP 请求 为例,代码如下:
import { httpdns } from "@tencentcloud/httpdns";
import { http } from '@kit.NetworkKit';
import connection from '@ohos.net.connection';
import { BusinessError } from '@kit.BasicServicesKit';
import Url from '@ohos.url';

// 使用connection发送网络请求
async connectionWithHttpDns(url: string, options: http.HttpRequestOptions) {
let urlObject = Url.URL.parseURL(url);
const host = urlObject.hostname;
// ************* HTTPDNS解析获取域名 begin *************
let result = await httpdns.getInstance().getHostByName(host);
// ************* HTTPDNS解析获取域名 end *************
// ************* 通过系统API设置DNS规则 begin *************
try {
await connection.removeCustomDnsRule(host);
} catch (ignored) {
}
result = result.filter((item)=>item!=='0');
if (result?.length > 0) {
await connection.addCustomDnsRule(host, result);
} else {
console.log(`httpdns解析没有结果,不设置dns`);
}
// ************* 通过系统API设置DNS规则 end *************

// ************* 通过系统API进行网络请求 begin *************
const httpRequest = http.createHttp();
httpRequest.request(url, options, (err: BusinessError, data: http.HttpResponse) => {
if (!err) {
const res = data.result;
console.info(`Response succeeded: ${res}`);
console.info('Response code:' + data.responseCode);
} else {
const errStr = JSON.stringify(err);
console.error(`Response err: Code is ${err.code}, message is ${errStr}`);
}
});
// ************* 通过系统API进行网络请求 end *************
}
说明:
HarmonyOS 提供了定制 DNS 解析规则的 API:addCustomDnsRule、removeCustomDnsRule、clearCustomDnsRules。
通过 addCustomDnsRule API 应用可以添加自定义 host 和对应的 IP 地址的映射,
通过 removeCustomDnsRule API 应用可以删除对应 host 的自定义 DNS 规则,
通过 clearCustomDnsRules API 应用可以删除所有的自定义 DNS 规则。
因此,当应用想要定制网络请求的 DNS 规则时,可以在网络请求之前,通过上述 API 设置对应的规则,然后再发起网络请求。

Remote Communication Kit 的 dnsRules 方式

当使用 Remote Communication Kit 包进行网络请求时,可以先调用 SDK 的域名解析 API 进行 HTTPDNS 解析,然后通过配置 dnsRules 字段,修改 DNS 规则,以 fetch 请求 为例,代码如下:
import { httpdns } from "@tencentcloud/httpdns";
import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
import Url from '@ohos.url';

// 使用rcp发送网络请求
async remoteWithHttpDns(url: string) {
let urlObject = Url.URL.parseURL(url);
const host = urlObject.hostname;

// ************* HTTPDNS解析域名获取IP结果 begin *************·
let result = await httpdns.getInstance().getHostByName(host);
result = result.filter((item)=>item!=='0');
// ************* HTTPDNS解析域名获取IP结果 end *************
const request = new rcp.Request(url, "GET");
request.configuration = {
dns: {
// ************* 通过dnsRules设置IP begin *************
dnsRules: [{
host,
port: 80,
ipAddresses: result
}, {
host,
port: 443,
ipAddresses: result
}]
// ************* 通过dnsRules设置IP end *************
}
}

// ************* 通过系统API进行网络请求 begin *************
const session = rcp.createSession();
return session.fetch(request).then((data: rcp.Response) => {
console.info(`Response succeeded: ${data}`);
console.info('Response code:' + data.statusCode);
}).catch((err: BusinessError) => {
const errStr = JSON.stringify(err);
console.error(`Response err: Code is ${err.code}, message is ${errStr}`);
});
;
// ************* 通过系统API进行网络请求 end *************
}

API 接口

如果要对 SDK 进行更精细的配置或者使用鉴权请求等其它功能,可以参考 HarmonyOS SDK API。