HarmonyOS端HTTPDNS+阿里云OSS SDK最佳实践

本文档介绍在HarmonyOS客户端上使用阿里云OSS SDK接入HTTPDNS的方案。

1. 背景说明

阿里云对象存储OSS(Object Storage Service)是一款通用的云存储服务,可让开发者在各类应用中便捷地存储和访问用户头像、图片、音视频等文件。在HarmonyOS端,可以通过集成OSS HarmonyOS SDK来完成。

为了提升文件传输的稳定性和速度,可以将HTTPDNS SDKOSS HarmonyOS SDK进行结合,对OSS域名进行解析。这可以有效实现域名防劫持和DNS解析加速,从而优化应用访问OSS的网络体验。

2. 接入步骤

HarmonyOS上,将HTTPDNSOSS SDK进行集成,整个接入过程分为以下两个核心步骤:

  1. 创建一个集成了HTTPDNS解析能力的rcp.Session

  2. 使用这个定制化的会话来初始化OSS客户端。

2.1 创建集成HTTPDNSSession

首先,需要创建一个rcp.Session实例,并在其配置中嵌入自定义的DNS解析规则,该规则会调用HTTPDNS服务来解析域名。

HTTPDNS的完整接入流程,参考HarmonyOS SDK接入HarmonyOS SDK接入

import { httpdns } from '@aliyun/httpdns';
import { rcp } from '@kit.RemoteCommunicationKit';

/**
 * 创建一个集成了阿里云HTTPDNS解析能力的网络会话 (rcp.Session)。
 *
 * @param httpdnsAccountId 您的阿里云HTTPDNS Account ID。
 * @returns 返回一个配置好DNS解析规则的 rcp.Session 实例。
 */
async function createHttpDnsEnhancedSession(httpdnsAccountId: string): Promise<rcp.Session> {
  const httpdnsService = await httpdns.getService(httpdnsAccountId);

  const sessionConfig: rcp.SessionConfiguration = {
    requestConfiguration: {
      dns: {
        dnsRules: (host: string): string[] => {
          try {
            const result = httpdnsService.getHttpDnsResultSyncNonBlocking(host);
            let addresses: string[] = [];

            if (result.ipv4s && result.ipv4s.length > 0) {
              addresses.push(...result.ipv4s);
            }
            
            if (result.ipv6s && result.ipv6s.length > 0) {
              addresses.push(...result.ipv6s);
            }

            if (addresses.length > 0) {
              return addresses; // 返回合并后的IP地址列表
            }
          } catch (error) {
            console.error(`[HttpDNS] 解析失败: ${host}`, error);
          }
          
          // 当解析失败或无结果时,返回空数组以降级到系统默认DNS
          return [];
        }
      }
    }
  };

  return rcp.createSession(sessionConfig);
}

2.2 使用该Session初始化OSS客户端

其次,将上一步创建的rcp.Session实例,在初始化OSS客户端时作为配置参数传入。这样,所有通过该客户端发起的网络请求都将自动使用我们定义的HTTPDNS解析逻辑。

OSS SDK的接入和使用,可以参考OSS Harmony SDK(预览版)

import Client from '@aliyun/oss';
// 省略 createHttpDnsEnhancedSession 函数内容

/**
 * 演示如何初始化一个使用HTTPDNS增强会话的OSS客户端。
 */
async function initializeOssClientWithHttpDns() {
  const YOUR_HTTPDNS_ACCOUNT_ID = 'your_httpdns_account_id'; // 替换为您的Account ID
  const YOUR_ACCESS_KEY_ID = 'your_access_key_id';         // 替换为您的AK
  const YOUR_ACCESS_KEY_SECRET = 'your_access_key_secret'; // 替换为您的SK
  const YOUR_REGION = 'oss-cn-hangzhou';                   // 替换为您的Region

  // 调用步骤一的函数,创建集成了HTTPDNS的Session
  const httpDnsSession = await createHttpDnsEnhancedSession(YOUR_HTTPDNS_ACCOUNT_ID);

  // 初始化OSS客户端,并将创建好的Session实例传递进去
  const ossClient = new Client({
    accessKeyId: YOUR_ACCESS_KEY_ID,
    accessKeySecret: YOUR_ACCESS_KEY_SECRET,
    region: YOUR_REGION,
    session: httpDnsSession, // 核心:传入定制化的session
  });

  console.log('OSS Client with HttpDNS initialized successfully!');

  // 此 ossClient 实例已成功集成HTTPDNS。
  // 后续操作(如上传、下载)的网络请求将自动通过HTTPDNS解析。
  // await ossClient.putObject(...);
  
  return ossClient;
}
重要

HTTPDNS SDK初始化设置需要在OSS SDK初始化设置之前完成。

3. 总结

通过为OSS客户端提供一个带有自定义DNS解析规则的rcp.Session实例,可以在HarmonyOS上实现HTTPDNSOSS SDK的结合,从而优化网络性能与安全性。

集成过程中的关键注意点如下:

  • 初始化顺序:必须先初始化HTTPDNS服务,再初始化OSS客户端。

  • 降级处理:dnsRules回调中,当HTTPDNS解析无结果或失败时,务必返回空数组[]以启用系统DNS降级。