HarmonyOS 鸿蒙隔离层设计

在软件开发中,底层库的更换或升级是常见的需求,这可能由性能提升、新功能需求或安全性考虑等因素驱动。为了降低迁移成本,良好的设计模式至关重要。

在版本迭代过程中,网络请求库可能会经历从A到B再到C的演进。为了实现业务层的无感切换,需要在各个请求库和业务代码之间封装隔离代码,以实现第三方网络库的灵活更换。

回调接口 (ICallback)

定义了ICallback接口,包含onSuccessonFailure两个方法,用于处理异步操作的成功和失败情况。

typescript 复制代码
/**
 * ICallback 接口定义了处理异步操作成功时的回调逻辑。
 * 这个接口通常用于网络请求操作,当操作成功完成时,
 * 通过实现此接口的对象的 onSuccess 方法来处理结果。
 */
export interface ICallback {
  /**
   * 当异步操作成功时调用此方法。
   *
   * @param result 操作结果的数据,通常是一个字符串类型,可以是 JSON 格式、XML 格式或其他文本格式。
   *              具体格式取决于异步操作的上下文和需求。
   */
  onSuccess(result: string): void;
  
  /**
   * 当异步操作失败时调用此方法。
   *
   * @param error 错误信息,提供失败操作的描述。
   *             这可以是技术性错误(如网络问题、解析错误等)或业务逻辑错误。
   */
  onFailure(error: string): void;
}

HTTP响应处理 (HttpCallback)

HttpCallback类实现了ICallback接口,专门为处理HTTP响应结果设计。它将响应字符串解析为JSON对象,并调用onParsedSuccess方法来处理解析后的对象。

typescript 复制代码
import { ICallback } from './ICallback';

/**
 * HttpCallback 类是 ICallback 接口的一个实现,专门为处理 HTTP 响应结果设计。
 * 它定义了一个从 JSON 字符串解析结果并将其转换为特定类型对象的 onSuccess 方法,
 * 然后通过抽象方法 onParsedSuccess 将对象传递给进一步的处理。
 * T 泛型允许开发者指定他们希望从 JSON 字符串解析得到的类型。
 */
export abstract class HttpCallback<T> implements ICallback {
  /**
   * 当异步操作成功时调用此方法。
   * 此方法实现了 ICallback 接口的 onSuccess,将字符串结果解析为 JSON 对象,
   * 并调用抽象方法 onParsedSuccess 来处理解析后的对象。
   *
   * @param result 异步操作返回的 JSON 格式的字符串数据。
   */
  onSuccess(result: string): void {
    // 将 JSON 格式的字符串结果解析为一个对象,对象的类型由泛型 T 指定。
    let objResult: T = JSON.parse(result) as T;
    // 将解析后的对象传递给抽象方法 onParsedSuccess 进行进一步处理。
    this.onParsedSuccess(objResult);
  }

  /**
   * 当异步操作失败时调用此方法。
   *
   * @param error 错误信息,提供失败操作的描述。
   *             这可以是技术性错误(如网络问题、解析错误等)或业务逻辑错误。
   */
  onFailure(error: string): void {

  }

  /**
   * 抽象方法,用于处理从 JSON 字符串成功解析后得到的特定类型的对象。
   * 具体的处理逻辑需要在子类中实现。
   *
   * @param objResult 从 JSON 字符串解析得到的特定类型的对象。
   */
  protected abstract onParsedSuccess(objResult: T): void;
}

HTTP请求处理器接口 (IHttpRequest)

IHttpRequest接口定义了postget两个方法,用于发送POST和GET请求。

typescript 复制代码
// 引入 ICallback 接口的声明
import { ICallback } from './ICallback';

/**
 * IHttpRequest 接口定义了处理 HTTP 请求所需的方法。
 * 该接口包含一个 post 方法,用于发送 POST 请求到指定的 URL。
 */
export interface IHttpRequest {
  /**
   * 发送一个 POST 请求到指定的 URL。
   *
   * @param url 请求的目标 URL 地址。
   * @param params 一个包含请求参数的 Map 对象,键和值都是字符串类型。
   * @param callback 一个回调函数,用于处理请求完成后的结果。
   *                 这个回调函数遵循 ICallback 接口定义的签名。
   */
  post(url: string, params: Map<string, string>, callback: ICallback): void;

  /**
   * 发送一个 get 请求到指定的 URL。
   * @param url  这个回调函数遵循 ICallback 接口定义的签名。
   * @param callback 一个回调函数,用于处理请求完成后的结果。
   *                 这个回调函数遵循 ICallback 接口定义的签名。
   */
  get(url: string, callback: ICallback): void;
}

HTTP请求处理 (HttpHelper)

  • HttpHelper类实现了单例模式,用于管理网络请求。
  • 提供了init方法来初始化网络请求处理器。
  • post和get方法用于发送POST和GET请求,它们代理到具体的网络请求处理器。
typescript 复制代码
import { ICallback } from './ICallback';
import { IHttpRequest } from './IHttpRequest';
/**
 * 代理类,用于网络请求管理
 */
export class HttpHelper implements IHttpRequest {
  /**
   * 存储 IHttpProcessor 接口的实际实现。
   * 这个属性由 init 方法设置,用于指定 HttpHelper 应该代理到哪个具体的网络请求处理器。
   */
  private static mIHttpProcessor: IHttpRequest;

  /**
   * 私有构造函数,防止外部直接通过 new 关键字创建实例。
   */
  constructor() {
    // 初始化逻辑可以在这里实现
  }

  //单例
  private static instance: HttpHelper;

  /**
   * 获取 HttpHelper 的单例实例。
   * @returns {HttpHelper} HttpHelper 的单例实例。
   */
  public static obtain(): HttpHelper {
    if (!HttpHelper.instance) {
      HttpHelper.instance = new HttpHelper();
    }
    return HttpHelper.instance;
  }

  /**
   * 初始化代理类,设置它应该使用的网络请求处理器。
   * @param httpProcessor 实现 IHttpProcessor 接口的对象。
   */
  public static init(httpProcessor: IHttpRequest): void {
    HttpHelper.mIHttpProcessor = httpProcessor;
  }

  /**
   * 发送一个 POST 请求。
   * 这个方法代理到 mIHttpProcessor 的 post 方法,实现了网络请求的功能。
   * @param url 请求的 URL 地址。
   * @param params 包含请求参数的 Map 对象。
   * @param callback 处理请求结果的回调函数。
   */
  post(url: string, params: Map<string, string>, callback: ICallback): void {
    // 代理到 IHttpProcessor 实例的 post 方法
    HttpHelper.mIHttpProcessor.post(url, params, callback);
  }

  /**
   * 发送一个 get 请求。
   * 这个方法代理到 mIHttpProcessor 的 get 方法,实现了网络请求的功能。
   * @param url 请求的 URL 地址。
   * @param callback 处理请求结果的回调函数。
   */
  get(url: string, callback: ICallback): void {
    // 代理到 IHttpProcessor 实例的 get 方法
    HttpHelper.mIHttpProcessor.get(url, callback);
  }
}

具体的网络实现 (HttptoolRequest)

  • HttptoolRequest类是IHttpRequest的一个具体实现,使用了三方网络请求库(httptool)来发送网络请求。
  • 它实现了post和get方法,用于处理POST和GET请求,并使用回调来处理响应。
typescript 复制代码
import http from '@ohos.net.http';
import { HttpManager } from '@xufeng/httptool/src/main/ets/http/HttpManager';
import { RequestMethod } from '@xufeng/httptool/src/main/ets/http/RequestOptions';
import { HomePageNewIndexBean } from '@xufeng/httptool/src/main/ets/model/NewsModel';
import { Tongue } from '../bean/Tongue';
import { ICallback } from './ICallback';
import { IHttpRequest } from './IHttpRequest';

/**
 * HttptoolRequest 类实现了 IHttpRequest 接口,用于执行网络 POST 请求。
 * 可以使用第三方 SDK 来处理实际的网络请求。
 */
export class HttptoolRequest implements IHttpRequest {
  /**
   * 发送一个 POST 请求到指定的 URL,并处理响应。
   *
   * @param url 请求的目标 URL 地址。
   * @param params 一个 Map 对象,包含了请求的参数。
   * @param callback 实现 ICallback 接口的回调函数,用于处理请求完成后的结果。
   */
  post(url: string, params: Map<string, string>, callback: ICallback): void {

    let headers: Record<string, string> = {
      "X-APISpace-Token": 'X-APISpace-Token信息',
      "Content-Type": 'application/x-www-form-urlencoded',
    };
    HttpManager.getInstance().request<string>({
      method: RequestMethod.POST,
      url: url,
      header: headers,
      extraData:params
    }).then((response) => {
      console.log("response:" + JSON.stringify(response))
      callback.onSuccess(JSON.stringify(response))

    }).catch((err) => {
      console.log("err:" + JSON.stringify(err))
      callback.onFailure(JSON.stringify(err))
    })
  }

  /**
   * 发送一个 get 请求到指定的 URL,并处理响应。
   *
   * @param url 请求的目标 URL 地址。
   * @param params 一个 Map 对象,包含了请求的参数。
   * @param callback 实现 ICallback 接口的回调函数,用于处理请求完成后的结果。
   */
  get(url: string, callback: ICallback): void {
    HttpManager.getInstance().request<string>({
      method: RequestMethod.GET,
      url: url
    }).then((response) => {
      console.log("response:" + JSON.stringify(response))
      callback.onSuccess(JSON.stringify(response))

    }).catch((err) => {
      console.log("err:" + JSON.stringify(err))
      callback.onFailure(JSON.stringify(err))
    })
  }
}

业务层调用

通过HttpHelper初始化使用的三方网络请求处理器,并发送POST请求。

typescript 复制代码
HttpHelper.init(new HttptoolRequest());
let postURL: string = 'https://eolink.o.apispace.com/rkl/common/tongue/getTongueList'
let params: Map<string, string> = new Map<string, string>();
params.set('pageSize', '5')
params.set('page', '1')
HttpHelper.obtain().post(postURL, params, new (class Http extends HttpCallback<Tongue> {
  onParsedSuccess(tongue: Tongue): void {
    console.log("tongue==========" + JSON.stringify(tongue));
  }
}));
相关推荐
鸿蒙场景化示例代码技术工程师1 分钟前
基于Canvas实现选座功能鸿蒙示例代码
华为·harmonyos
小脑斧爱吃鱼鱼1 小时前
鸿蒙项目笔记(1)
笔记·学习·harmonyos
鸿蒙布道师2 小时前
鸿蒙NEXT开发对象工具类(TS)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
zhang1062092 小时前
HarmonyOS 基础组件和基础布局的介绍
harmonyos·基础组件·基础布局
马剑威(威哥爱编程)2 小时前
在HarmonyOS NEXT 开发中,如何指定一个号码,拉起系统拨号页面
华为·harmonyos·arkts
GeniuswongAir4 小时前
Flutter极速接入IM聊天功能并支持鸿蒙
flutter·华为·harmonyos
90后的晨仔7 小时前
鸿蒙ArkUI框架中的状态管理
harmonyos
别说我什么都不会1 天前
OpenHarmony 5.0(API 12)关系型数据库relationalStore 新增本地数据变化监听接口介绍
api·harmonyos
MardaWang1 天前
HarmonyOS 5.0.4(16) 版本正式发布,支持wearable类型的设备!
华为·harmonyos
余多多_zZ1 天前
鸿蒙学习手册(HarmonyOSNext_API16)_应用开发UI设计:Swiper
学习·ui·华为·harmonyos·鸿蒙系统