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:addCustomDnsRuleremoveCustomDnsRuleclearCustomDnsRules
通过 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