本文介绍HarmonyOS SDK的如何进行软件定义解析。
基本概念
首先,请参考概述及相关文档整体了解软件定义解析如何使用。
软件定义解析
对于SDK而言,软件定义解析(后续简称为SDNS)相比一般的域名解析,需要额外关注SDNS参数,缓存key,解析结果中的额外参数。先看一个示例:
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}`);
});
HTTPDNS提供getSDnsResultAsync异步方法实现SDNS,参数有4个:
host:与getHttpDnsResultAsync参数host含义一致
params:本次SDNS请求的参数,以key、value键值对组成的对象。SDNS的自定义解析函数消费
cacheKey:本次SDNS请求的缓存标识,SDK使用,相同cacheKey的缓存结果会放到一个缓存中。
type:与getHttpDnsResultAsync参数type含义一致
getSDnsResultAsync方法返回值有5个参数:
host:解析的域名
ipv4s:解析的IPv4地址数组,如果没有结果会是undefined
ipv6s:解析的IPv6地址数组,如果没有结果会是undefined
extraStr:SDNS自定义解析函数设置的extra字段
extra: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}`);
});