软件定义解析

本文介绍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

  • IpType.V4:需要解析IPv4类型的地址

  • IpType.V6:需要解析IPv6类型的地址

  • IpType.Both:需要解析IPv4IPv6类型的地址

  • IpType.Auto:根据设备当前的网络栈情况判断,如果仅支持IPv4,则解析IPv4类型地址;如果仅支持IPv6,或者都支持,则解析IPv4IPv6类型的地址

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方法一样。