本文介紹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實例就會持有解析結果的內存緩存,方便后續網絡請求時快速獲取。