HarmonyOS SDK接入

本章节介绍了HarmonyOS SDK的接入方法。

前言

本SDK基于HarmonyOS API 12开发,compileSdkVersion 为 5.0.0(12)。

说明

在Beta5以下版本的HarmonyOS中,开发者在通过定制DNS解析规则访问特定IP的服务器时,必须在URL中显式指定访问端口,否则可能会导致定制DNS解析规则不生效,自动降级到LocalDNS

准备工作

  1. 请了解产品使用流程,获取Account ID

  2. 请参考HarmonyOS应用开发文档准备HarmonyOS应用开发环境

第一步:安装SDK

在HarmonyOS应用根目录执行以下命令安装SDK:

ohpm install @aliyun/httpdns

ohpm工具及更多关于OpenHarmony安装第三方SDK的信息请参考OpenHarmony三方库中心仓说明

第二步:配置SDK

在Alibity onCreate生命周期回调中执行以下代码配置SDK:

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 {
    // ************* 初始化配置 begin *************
    httpdns.configService(ACCOUNT_ID, {
      context: this.context,
    });
    // ************* 初始化配置 end *************
  }

  // 省略其它代码
}

其中ACCOUNT_ID变量为产品使用流程中获取Account ID。

第三步:使用SDK

addCustomDnsRule方式

在发起网络请求之前,调用SDK的API进行HTTPDNS解析,通过connection.addCustomDnsRuleAPI配置HTTPDNS的解析结果,以HTTP请求为例,代码如下:

import { http } from '@kit.NetworkKit';
import connection from '@ohos.net.connection';
import { httpdns, IpType, } from '@aliyun/httpdns';
import Url from '@ohos.url';

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

export async function requestWithHttpDns(url: string, options: http.HttpRequestOptions): Promise<http.HttpResponse> {
  let urlObject = Url.URL.parseURL(url);
  const host = urlObject.hostname;
  // ************* HTTPDNS解析获取域名 begin *************
  const httpdnsService = await httpdns.getService(ACCOUNT_ID);
  const result = await httpdnsService.getHttpDnsResultAsync(host, IpType.Auto);
  // ************* HTTPDNS解析获取域名 end *************
  // ************* 通过系统API设置DNS规则 begin *************
  try {
    await connection.removeCustomDnsRule(host);
  } catch (ignored) {
  }
  if (result.ipv4s?.length ?? 0 > 0) {
    await connection.addCustomDnsRule(host, result.ipv4s);
  } else if (result.ipv6s?.length ?? 0 > 0) {
    await connection.addCustomDnsRule(host, result.ipv6s);
  } else {
    console.log(`httpdns解析没有结果,不设置dns`);
  }
  // ************* 通过系统API设置DNS规则 begin *************
  // ************* 通过系统API进行网络请求 begin *************
  const httpRequest = http.createHttp();
  return httpRequest.request(url, options);
  // ************* 通过系统API进行网络请求 end *************
}

其中ACCOUNT_ID变量为产品使用流程中获取Account ID。

重要

HarmonyOS 如何定制DNS解析规则

HarmonyOS 提供了定制DNS解析规则的API:addCustomDnsRuleremoveCustomDnsRuleclearCustomDnsRules

通过addCustomDnsRule API应用可以添加自定义host和对应的IP地址的映射,

通过removeCustomDnsRule API应用可以删除对应host的自定义DNS规则,

通过clearCustomDnsRules API应用可以删除所有的自定义DNS规则。

因此,当应用想要定制网络请求的DNS规则时,可以在网络请求之前,通过上述API设置对应的规则,然后再发起网络请求。

Remote Communication Kit的dnsRules方式

当使用Remote Communication Kit包进行网络请求时,可以通过配置dnsRules字段,修改DNS规则,以fetch请求为例,代码如下:

import { httpdns, IpType } from '@aliyun/httpdns';
import { rcp } from '@kit.RemoteCommunicationKit';
import Url from '@ohos.url';

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

export async function rcpWithHttpDns(url: string): Promise<rcp.Response> {
  let urlObject = Url.URL.parseURL(url);
  const host = urlObject.hostname;

  // ************* HTTPDNS解析域名获取IP结果 begin *************
  const httpdnsService = await httpdns.getService(ACCOUNT_ID);
  const httpdnsResult = await httpdnsService.getHttpDnsResultAsync(host, IpType.Auto);
  let addresses: string[] = [];
  if (httpdnsResult.ipv4s) {
    addresses.push(...httpdnsResult.ipv4s)
  }
  if (httpdnsResult.ipv6s) {
    addresses.push(...httpdnsResult.ipv6s)
  }
  // ************* HTTPDNS解析域名获取IP结果 end *************

  const request = new rcp.Request(url, "GET");
  request.configuration = {
    dns: {
      // ************* 通过dnsRules设置IP begin *************
      dnsRules: [{
        host,
        port: 80,
        ipAddresses: addresses
      }, {
        host,
        port: 443,
        ipAddresses: addresses
      }]
      // ************* 通过dnsRules设置IP end *************
    }
  }

  // ************* 通过系统API进行网络请求 begin *************
  const session = rcp.createSession();
  return session.fetch(request);
  // ************* 通过系统API进行网络请求 end *************
}

其中ACCOUNT_ID变量为产品使用流程中获取Account ID。

后续步骤

如果要对SDK进行更精细的配置或者使用鉴权请求等其它功能,可以参考HarmonyOS SDK API