本文介绍HarmonyOS SDK的如何进行软件定义解析。
基本概念
首先,请参考概述及相关文档整体了解软件定义解析如何使用。
软件定义解析
对于SDK而言,软件定义解析(后续简称为SDNS)相比一般的域名解析,需要额外关注SDNS参数、缓存key和解析结果中的额外参数。
SDNS异步请求
HTTPDNS提供getSDnsResultAsync异步方法实现SDNS,示例如下:
import { httpdns, HttpDnsError, HttpDnsResult, IpType } from '@aliyun/httpdns';
const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID';
httpdns.getService(ACCOUNT_ID).then((service) => {
// ************* SDNS请求 begin *************
return service.getSDnsResultAsync(HOST, { 'keyA': 'valueA' }, 'cacheKey1', IpType.Auto);
// ************* SDNS请求 end *************
}).then((result: HttpDnsResult) => {
console.log(`解析的域名 ${result.host}`);
console.log(`解析的ipv4地址 ${result.ipv4s?.join(',')}`);
console.log(`解析的ipv6地址 ${result.ipv6s?.join(',')}`);
console.log(`SDNS额外参数(字符串格式) ${result.extraStr}`);
console.log(`SDNS额外参数(转化为对象) ${result.extra}`);
}).catch((e: HttpDnsError) => {
console.error(`失败 ${e.code} ${e.message}`);
});
getSDnsResultAsync方法参数有4个:
参数 | 类型 | 是否必填 | 说明 |
host | string | 是 | 待解析的域名,与getHttpDnsResultAsync参数host含义一致 |
params | Record<string, string> | 是 | 本次SDNS请求的参数,以key、value键值对组成的对象。SDNS的自定义解析函数消费 |
cacheKey | string | 是 | 本次SDNS请求的缓存标识,SDK使用,相同cacheKey的缓存结果会放到一个缓存 |
type | IpType | 否 | 与getHttpDnsResultAsync参数type含义一致,期望解析的IP类型,有四种情况,如果不传则默认为IpType.V4
|
getSDnsResultAsync方法返回值有5个参数:
参数 | 类型 | 说明 |
host | string | 解析的域名 |
ipv4s | Array<string> | 解析的IPv4地址数组,如果没有结果会是undefined |
ipv6s | Array<string> | 解析的IPv6地址数组,如果没有结果会是undefined |
extraStr | string | SDNS自定义解析函数设置的extra字段 |
extra | Record<string, string> | JSON反序列化extraStr字段得到的key、value键值对对象 |
相比getHttpDnsResultAsync方法,getSDnsResultAsync主要是提供了params、cacheKey参数来传递SDNS自定义解析函数所需要的参数,提供了extra、extraStr返回字段接受SDNS自定义解析函数设置的extra字段。
SDNS公共参数
如果SDNS请求公共参数,SDK提供了额外的方法来简化对公共参数的管理。示例如下:
import { httpdns, HttpDnsError } from '@aliyun/httpdns';
const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID';
httpdns.getService(ACCOUNT_ID).then((service) => {
// ************* SDNS公共参数维护 begin *************
// 添加公共参数
service.setSDnsGlobalParams({
'globalKeyA': 'globalValueA',
'globalKeyB': 'globalValueB'
});
// 清空公共参数
service.clearSDnsGlobalParams();
// ************* SDNS公共参数维护 end *************
}).catch((e: HttpDnsError) => {
console.error(`失败 ${e.code} ${e.message}`);
});
setSDnsGlobalParams用于添加公共参数,clearSDnsGlobalParams用于删除公共参数。
每次SDNS请求都会携带已添加的公共参数。
如果单次SDNS请求的参数key和公共参数key相同,单次请求的参数会覆盖公共参数。
SDNS同步请求
和getHttpDnsResultAsync类似,SDK也提供了SDNS的同步方法getSDnsResultSyncNonBlocking,示例如下:
import { httpdns, HttpDnsError, HttpDnsResult, IpType } from '@aliyun/httpdns';
const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID';
httpdns.getService(ACCOUNT_ID).then((service) => {
// ************* SDNS同步请求 begin *************
const result = service.getSDnsResultSyncNonBlocking(HOST, { 'keyA': 'valueA' }, 'cacheKey1', IpType.Auto);
// ************* SDNS同步请求 end *************
console.log(`解析的域名 ${result.host}`);
console.log(`解析的ipv4地址 ${result.ipv4s?.join(',')}`);
console.log(`解析的ipv6地址 ${result.ipv6s?.join(',')}`);
console.log(`SDNS额外参数(字符串格式) ${result.extraStr}`);
console.log(`SDNS额外参数(转化为对象) ${result.extra}`);
}).catch((e: HttpDnsError) => {
console.error(`失败 ${e.code} ${e.message}`);
});
getSDnsResultSyncNonBlocking方法的参数与返回值与getSDnsResultAsync方法一样。