このトピックでは、HarmonyOS ソフトウェア開発キット(SDK)を統合する方法について説明します。
はじめに
この SDK は HarmonyOS API 12 に基づいており、compileSdkVersion は 5.0.0(12) です。
Beta5 より前の HarmonyOS バージョンでは、カスタムドメイン名前解決 (DNS) ルールを使用して特定の IP アドレスでサーバーにアクセスする場合、URL にポートを指定する必要があります。そうしないと、カスタム DNS ルールが有効にならず、システムは自動的に LocalDNS にフォールバックします。
前提条件
プロダクトのワークフローを理解し、アカウント ID を取得します。
HarmonyOS アプリケーション開発者環境を準備します。詳細については、「HarmonyOS Application Development Guide」をご参照ください。
ステップ 1:SDK をインストールする
HarmonyOS アプリケーションのルートディレクトリで次のコマンドを実行して、SDK をインストールできます。
ohpm install @aliyun/httpdnsohpm ツールおよび OpenHarmony のサードパーティ SDK のインストール方法の詳細については、「OpenHarmony Third-party Library Repository Guide」をご参照ください。
ステップ 2:SDK を構成する
Ability の `onCreate` ライフサイクルコールバックで次のコードを実行して、SDK を設定できます。
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { httpdns } from '@aliyun/httpdns';
const ACCOUNT_ID = 'これを Alibaba Cloud HTTPDNS コンソールのアカウント ID に置き換えます'
export default class EntryAbility extends UIAbility {
onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
// ************* 初期化構成の開始 *************
httpdns.configService(ACCOUNT_ID, {
context: this.context,
// 起動サービスノードを設定します。ターゲットリージョンを明示的に選択する必要があります。有効な値は Region.SG、Region.HK、Region.US、および Region.DE です。
region: Region.SG,
useHttps: true,
});
// ************* 初期化構成の終了 *************
}
// 他のコードは省略されています
}ACCOUNT_ID 変数は、プロダクトワークフローで取得したアカウント ID です。
useHttps パラメーターを true に設定した場合、追加の課金費用が発生します。 詳細については、「課金ドキュメント」をご参照ください。
ドメイン名情報または SDNS パラメーターに高いレベルのセキュリティが必要な場合は、aesSecretKey パラメーターを設定して、解決リクエストのコンテンツレイヤーの暗号化を有効にできます。コンテンツの暗号化を使用すると、追加の課金コストが発生します。詳細については、課金ドキュメントをご参照ください。
ステップ 3:SDK を使用する
`addCustomDnsRule` メソッドの使用
ネットワークリクエストを送信する前に、SDK の名前解決 API を呼び出して HTTPDNS 名前解決を実行できます。次に、connection.addCustomDnsRule API を使用して HTTPDNS 名前解決の結果を設定し、現在のアプリケーションに対してホストとそれに対応する IP アドレス間のカスタムマッピングを追加します。次のコードは、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 = 'Alibaba Cloud HTTPDNS コンソールのアカウント ID に置き換えてください'
export async function requestWithHttpDns(url: string, options: http.HttpRequestOptions): Promise<http.HttpResponse> {
let urlObject = Url.URL.parseURL(url);
const host = urlObject.hostname;
// ************* ドメイン名を取得するための HTTPDNS 名前解決の開始 *************
const httpdnsService = await httpdns.getService(ACCOUNT_ID);
const result = await httpdnsService.getHttpDnsResultAsync(host, IpType.Auto);
// ************* ドメイン名を取得するための HTTPDNS 名前解決の終了 *************
// ************* システム API を使用した DNS ルールの設定の開始 *************
try {
await connection.removeCustomDnsRule(host);
} catch (ignored) {
}
const allIps: string[] = [];
if (result.ipv4s && result.ipv4s.length > 0) {
allIps.push(...result.ipv4s);
}
if (result.ipv6s && result.ipv6s.length > 0) {
allIps.push(...result.ipv6s);
}
if (allIps.length > 0) {
console.info(`request with ${allIps?.join(',')}`);
await connection.addCustomDnsRule(host, allIps);
} else {
console.log(`HTTPDNS resolution returned no results. DNS rules are not set.`);
}
// ************* システム API を使用した DNS ルールの設定の終了 *************
// ************* システム API を使用したネットワークリクエストの送信の開始 *************
const httpRequest = http.createHttp();
return httpRequest.request(url, options);
// ************* システム API を使用したネットワークリクエストの送信の終了 *************
}ACCOUNT_ID 変数は、プロダクトワークフローで取得したアカウント ID です。
HarmonyOS で DNS 名前解決ルールをカスタマイズする方法
HarmonyOS は、DNS 名前解決ルールをカスタマイズするために、次の API を提供しています:addCustomDnsRule、removeCustomDnsRule、および clearCustomDnsRules。
`addCustomDnsRule` API を使用すると、アプリケーションはホストとそれに対応する IP アドレス間のカスタムマッピングを追加できます。
`removeCustomDnsRule` API を使用すると、アプリケーションは特定のホストのカスタム DNS ルールを削除できます。
`clearCustomDnsRules` API を使用すると、アプリケーションはすべてのカスタム DNS ルールを削除できます。
したがって、アプリケーションがネットワークリクエストの DNS ルールをカスタマイズする必要がある場合は、これらの API を使用して、ネットワークリクエストを送信する前にルールを設定できます。
`Remote Communication Kit` の `dnsRules` メソッドの使用
Remote Communication Kit パッケージを使用してネットワークリクエストを送信する場合、まず SDK のドメイン名前解決 API を呼び出して HTTPDNS 解決を実行できます。次に、dnsRules フィールドを設定して DNS ルールを変更できます。次のコードは、フェッチリクエストの例です。
import { httpdns, IpType } from '@aliyun/httpdns';
import { rcp } from '@kit.RemoteCommunicationKit';
import Url from '@ohos.url';
const ACCOUNT_ID = 'Alibaba Cloud HTTPDNS コンソールのアカウント ID に置き換えてください';
export async function rcpWithHttpDns(url: string): Promise<rcp.Response> {
let urlObject = Url.URL.parseURL(url);
const host = urlObject.hostname;
// ************* IP 結果を取得するための HTTPDNS 名前解決の開始 *************
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)
}
// ************* IP 結果を取得するための HTTPDNS 名前解決の終了 *************
const request = new rcp.Request(url, "GET");
request.configuration = {
dns: {
// ************* dnsRules を使用した IP アドレスの設定の開始 *************
dnsRules: [{
host,
port: 80,
ipAddresses: addresses
}, {
host,
port: 443,
ipAddresses: addresses
}]
// ************* dnsRules を使用した IP アドレスの設定の終了 *************
}
}
// ************* システム API を使用したネットワークリクエストの送信の開始 *************
const session = rcp.createSession();
return session.fetch(request);
// ************* システム API を使用したネットワークリクエストの送信の終了 *************
}ACCOUNT_ID 変数は、プロダクトワークフローで取得したアカウント ID です。
次のステップ
SDK をより詳細に設定したり、認証済みリクエストなどの他の機能を使用したりするには、「HarmonyOS SDK API」をご参照ください。