域名解析

本文介绍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实例就会持有解析结果的内存缓存,方便后续网络请求时快速获取。