基础配置

本文介绍HarmonyOS SDK的一些基础配置。

Context配置

由于SDK内部需要使用HarmonyOSAPI进行数据存储,需要Context参数,所以在配置时,需要设置Context参数。

示例代码如下:

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { httpdns } from '@aliyun/httpdns';

const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID'
        
export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // ************* 初始化配置 begin *************
    httpdns.configService(ACCOUNT_ID, {
      // 请务必配置harmony上下文
      context: this.context,
    });
    // ************* 初始化配置 end *************
  }
  // 省略其它代码
}
重要

context是必选配置。如果不配置会导致HTTPDNS的服务节点无法保存,降低HTTPDNS服务的可用性。

是否使用HTTPS请求

设置SDK内部向服务端发起解析请求时,是否使用HTTPS协议。若不调用该接口,默认使用HTTP协议。

使用HTTPS请求将会获得更高的安全性,但也要关注HTTPHTTPS两种方式在计费上的不同。关于计费逻辑可参考产品计费

使用HTTPS协议的配置如下:

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { httpdns } from '@aliyun/httpdns';

const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID'

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    httpdns.configService(ACCOUNT_ID, {
      context: this.context,
      // ************* 初始化配置是否使用HTTPS请求 begin *************
      useHttps: true,
      // ************* 初始化配置是否使用HTTPS请求 end *************
    });
  }
  // 省略其它代码
}

是否允许使用过期IP

SDK遵循DNS协议,按照TTL缓存域名解析结果,从而提升App在发起网络请求时获取IP的效率。当缓存过期后,若App调用解析接口获取IP,此时会有不同情况:

  1. 如果App调用的是同步非阻塞接口,因为缓存已过期,但SDK又无法立即从服务端获得新的解析结果,为了不阻塞线程,该接口将返回空结果,需要调用方做降级到LocalDNS解析的处理。

  2. 如果App调用的是异步接口,则SDK会发起解析请求从服务端获取新的解析,这个过程需要一定时间,则同步接口会阻塞线程直到获得新的解析结果。

SDK提供设置选项,允许复用过期IP,设置为YES后,则上述两种情况,虽然缓存的IP过期了,但接口仍然可以立即返回这个过期的IP,从而减少DNS环节处理时间,提升网络请求性能。同时,SDK发现该IP过期,返回后,也会立即启动异步线程对这个域名进行解析,从而获取新的解析结果。

因此,开启这个选项的副作用非常小,特别是在,所解析域名本身的解析配置不会频繁变动时(如主站域名、静态网关域名等)。若域名确实发生解析变更,则开启该选项也只会影响该域名缓存过期后的第一个请求,因为SDK在被调用时发现IP过期,总是会立即发起对这个域名的解析更新。

不允许使用过期IP的配置如下:

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { httpdns } from '@aliyun/httpdns';

const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID'

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 配置HTTPDNS
    httpdns.configService(ACCOUNT_ID, {
      context: this.context,
      // ************* 初始化配置是否允许使用过期IP begin *************
      enableExpiredIp: false,
      // ************* 初始化配置是否允许使用过期IP end *************
    })
  }
  // 省略其它代码
}

是否开启本地缓存

通过enableDiskCache配置项控制是否将解析结果存储在本地缓存中,默认为false,不开启。

当开启后,每次解析会把结果缓存到本地,当下次应用启动时,会从本地加载缓存解析结果,提高应用启动时获取解析结果的速度。

当开启本地缓存后,可以通过expiredThresholdMillis配置本地缓存过期时间。该参数决定App启动后,从持久层加载缓存到内存中时,丢弃已经过期超过expiredThresholdMillis时长的解析结果,默认为0毫秒。

开启本地缓存的配置如下:

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { httpdns } from '@aliyun/httpdns';

const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID'

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 配置HTTPDNS
    httpdns.configService(ACCOUNT_ID, {
      context: this.context,
      // ************* 初始化配置是否开启本地缓存 begin *************
      enableDiskCache: true,
      expiredThresholdMillis: 3600000,
      // ************* 初始化配置是否开启本地缓存 end *************
    })
  }
  // 省略其它代码
}

是否开启网络变化自动解析

配置当网络变化时,是否自动重新解析已解析的域名,默认为true,开启。

当网络变化时,已缓存的解析结果很有可能已经失效了,此时需要重新解析才能获取正确的结果。

关闭网络变化自动解析的配置如下:

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { httpdns } from '@aliyun/httpdns';

const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID'

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 配置HTTPDNS
    httpdns.configService(ACCOUNT_ID, {
      context: this.context,
      // ************* 初始化配置是否开启网络变化自动解析 begin *************
      reResolveCachedHostsAfterNetworkChanged: false,
      // ************* 初始化配置是否开启网络变化自动解析 end *************
    })
  }
  // 省略其它代码
}
重要
  • WiFi、蜂窝、无网络这三个状态之间的切换算网络变化。

  • 3G、4G、5G之间的切换不算网络变化。

超时配置

配置域名解析请求时的超时时长,默认为2000毫秒。

配置代码如下:

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { httpdns } from '@aliyun/httpdns';

const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID'

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 配置HTTPDNS
    httpdns.configService(ACCOUNT_ID, {
      context: this.context,
      // ************* 初始化配置超时时长 begin *************
      timeoutInMs: 3000
      // ************* 初始化配置超时时长 end *************
    })
  }
  // 省略其它代码
}

解析参数加密配置

配置域名解析接口参数加密Key,开启加密之后,SDK请求服务时,会对域名、客户端IP、自定义解析业务参数、解析类型进行加密,以密文的形式传输到服务端,提高数据安全性,不配置默认不加密。

配置代码如下:

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { httpdns } from '@aliyun/httpdns';

const ACCOUNT_ID = '这里需要替换为阿里云HTTPDNS控制台的Account ID'
const AES_SECRET_KEY = '这里需要替换为阿里云HTTPDNS控制台的AES加密Key'

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 配置HTTPDNS
    httpdns.configService(ACCOUNT_ID, {
      context: this.context,
      // ************* 初始化配置接口加密key begin *************
      aesSecretKey: AES_SECRET_KEY,
      // ************* 初始化配置接口加密key end *************
    })
  }
  // 省略其它代码
}