概述
移动解析 HTTPDNS 的主要功能是为了有效避免由于运营商传统 LocalDNS 解析导致的无法访问最佳接入点的方案。原理为使用 HTTP 加密协议替代传统的 DNS 协议,整个过程不使用域名,大大减少劫持的可能性。
前期准备
1. 开通移动解析 HTTPDNS 服务,详情请参见 开通移动解析 HTTPDNS。
2. 服务开通后,您需在移动解析 HTTPDNS 控制台添加解析域名才可正常使用,详情请参见 添加域名。
安装包
SDK 集成
在 HarmonyOS 应用根目录执行以下命令安装 SDK:
ohpm install @tencentcloud/httpdns
说明:
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 *************}
说明:
通过 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 *************}