本章節介紹了HarmonyOS SDK的接入方法。
前言
本SDK基于HarmonyOS API 12開發,compileSdkVersion 為 5.0.0(12)。
在Beta5以下版本的HarmonyOS中,開發者在通過定制DNS解析規則訪問特定IP的服務器時,必須在URL中顯式指定訪問端口,否則可能會導致定制DNS解析規則不生效,自動降級到LocalDNS
準備工作
請了解產品使用流程,獲取Account ID
請參考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:addCustomDnsRule、removeCustomDnsRule、clearCustomDnsRules。
通過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。