软件定义解析

本文介绍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}`);
});