本文介绍HarmonyOS SDK的域名解析接口。
获取HTTPDNS实例
获取实例之前,需要先完成HTTPDNS的基础配置。 要解析域名,需要通过HTTPDNS实例来完成域名的解析。代码如下:
import { httpdns, HttpDnsError } from '@aliyun/httpdns';
const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID';
// ************* 获取HTTPDNS实例 begin *************
httpdns.getService(ACCOUNT_ID).then((service) => {
// ************* 获取HTTPDNS实例 end *************
// 根据需要调用service的方法
}).catch((e: HttpDnsError) => {
console.error(`获取HTTPDNS实例失败 ${e.code} ${e.message}`);
});
域名解析
获取HTTPDNS实例之后,即可调用相关方法,解析域名,常用的方法是getHttpDnsResultAsync方法,示例如下:
import { httpdns, HttpDnsError, HttpDnsResult, IpType } from '@aliyun/httpdns';
const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID';
const HOST = 'www.aliyun.com';
httpdns.getService(ACCOUNT_ID).then((service) => {
// ************* 域名解析 begin *************
return service.getHttpDnsResultAsync(HOST, IpType.Auto);
// ************* 域名解析 end *************
}).then((result: HttpDnsResult) => {
console.log(`解析的域名 ${result.host}`);
console.log(`解析的ipv4地址 ${result.ipv4s?.join(',')}`);
console.log(`解析的ipv6地址 ${result.ipv6s?.join(',')}`);
}).catch((e: HttpDnsError) => {
console.error(`失败 ${e.code} ${e.message}`);
});
getHttpDnsResultAsync是基于Promise实现的异步方法,接收两个参数:
host:待解析的域名
type:期望解析的IP类型,有四种情况
IpType.V4:需要解析IPv4类型的地址
IpType.V6:需要解析IPv6类型的地址
IpType.Both:需要解析IPv4和IPv6类型的地址
IpType.Auto:根据设备当前的网络栈情况判断,如果仅支持IPv4,则解析IPv4类型地址;如果仅支持IPv6,或者都支持,则解析IPv4和IPv6类型的地址
getHttpDnsResultAsync的返回值是一个对象,有三个主要参数:
host:解析的域名
ipv4s:解析的IPv4地址数组,如果没有结果会是undefined
ipv6s:解析的IPv6地址数组,如果没有结果会是undefined
HTTPDNS实例会把每次的解析结果缓存到内存,在TTL有效期内,不会重复向HTTPDNS服务请求解析域名。
在默认配置下,允许使用过期IP,在经过TTL有效期后,会先返回之前缓存解析结果,并向HTTPDNS服务请求解析,用新的解析结果更新内存缓存。
同步解析
HTTPDNS实例还有同步解析接口getHttpDnsResultSyncNonBlocking,示例如下:
import { httpdns, HttpDnsError, HttpDnsResult, IpType } from '@aliyun/httpdns';
const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID';
const HOST = 'www.aliyun.com';
httpdns.getService(ACCOUNT_ID).then((service) => {
// ************* 同步域名解析 begin *************
const result = service.getHttpDnsResultSyncNonBlocking(HOST, IpType.Auto);
// ************* 同步域名解析 end *************
console.log(`解析的域名 ${result.host}`);
console.log(`解析的ipv4地址 ${result.ipv4s?.join(',')}`);
console.log(`解析的ipv6地址 ${result.ipv6s?.join(',')}`);
}).catch((e: HttpDnsError) => {
console.error(`失败 ${e.code} ${e.message}`);
});
getHttpDnsResultSyncNonBlocking是同步方法,参数和返回值与getHttpDnsResultAsync一样。
与getHttpDnsResultAsync不同的是,如果当前还没有缓存的解析结果,或者不允许使用过期IP而解析结果又过期了,则会先同步返回空结果,之后再向HTTPDNS服务请求解析,用新的解析结果更新内存缓存。
基于HarmonyOS单线程的设计,推荐使用getHttpDnsResultAsync方法。
预解析
HTTPDNS是通过HTTP协议向服务请求解析域名,第一次解析时没有缓存,会发起网络请求,占用一定的时间,所以为了提高网络请求的速度,可以进行提前批量解析,将主要的域名提前解析,减少真正网络请求时的时间消耗。批量解析的示例代码如下:
import { httpdns, HttpDnsError, IpType } from '@aliyun/httpdns';
const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID';
httpdns.getService(ACCOUNT_ID).then((service) => {
// ************* 预解析 begin *************
return service.resolveHosts(['www.aaa.com', 'www.bbb.com', 'www.ccc.com'], IpType.Auto);
// ************* 预解析 end *************
}).catch((e: HttpDnsError) => {
console.error(`失败 ${e.code} ${e.message}`);
});
resolveHosts是异步方法,参数有两个:
hosts:要进行预解析的域名列表
type:期望解析的IP类型,和getHttpDnsResultAsync的type参数定义一样
预解析之后,HTTPDNS实例就会持有解析结果的内存缓存,方便后续网络请求时快速获取。