HarmonyOS 鸿蒙隔离层设计

harmonyos · 浏览次数 : 4

小编点评

## Content Generation This generated content covers the following topics: **1. Introduction** * Definition of the `HttpHelper` class and its purpose. * Introduction to the `IHttpRequest` interface and its methods. **2. Proxy Class** * Description of the `private static mIHttpProcessor` member variable that stores the actual IHttpRequest implementation. * Explanation of how `init()` method initializes the `mIHttpProcessor` with a provided IHttpRequest instance. **3. `post()` Method** * Description of the `post()` method for handling POST requests. * Parameters: URL, request parameters (Map), and a callback function. * Implementation of the `post()` method using `HttpManager.getInstance().request` with appropriate headers and data. * On success, it calls the callback function with the response data. * On failure, it logs an error message and also calls the callback function with an error object. **4. `get()` Method** * Description of the `get()` method for handling GET requests. * Parameters: URL, request parameters (Map), and a callback function. * Implementation of the `get()` method using `HttpManager.getInstance().request` with appropriate method and URL. * On success, it calls the callback function with the response data. * On failure, it logs an error message and also calls the callback function with an error object. **5. Using `HttptoolRequest` Class** * Example usage of the `HttptoolRequest` class to send a POST request. * Variables: URL, parameters, and callback function. * Call to `init()` method to set the IHttpRequest handler. * Explanation of `post()` and `get()` methods and their usage. **6. Conclusion** * Summary of the class and its functionality. * Explanation of the proxy mechanism and how it delegates network requests.

正文

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

image

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

回调接口 (ICallback)

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

/**
 * 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方法来处理解析后的对象。

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请求。

// 引入 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请求,它们代理到具体的网络请求处理器。
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请求,并使用回调来处理响应。
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请求。

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));
  }
}));

与HarmonyOS 鸿蒙隔离层设计相似的内容:

HarmonyOS 鸿蒙隔离层设计

在软件开发中,底层库的更换或升级是常见的需求,这可能由性能提升、新功能需求或安全性考虑等因素驱动。为了降低迁移成本,良好的设计模式至关重要。 在版本迭代过程中,网络请求库可能会经历从A到B再到C的演进。为了实现业务层的无感切换,需要在各个请求库和业务代码之间封装隔离代码,以实现第三方网络库的灵活更换

鸿蒙HarmonyOS实战-窗口管理

前言 窗口管理是指计算机操作系统中管理和控制窗口的一种机制。窗口管理器负责处理窗口的创建、关闭、移动、调整大小等操作,并且决定窗口的位置、层级、是否可见、是否接收用户输入等属性。窗口管理器还负责绘制窗口的外观和边框,并提供用户与窗口交互的方式,如鼠标点击、键盘输入等。窗口管理器可以通过图形用户界

鸿蒙HarmonyOS实战-ArkTS语言基础类库(通知)

前言 移动应用中的通知是指应用程序发送给用户的一种提示或提醒消息。这些通知可以在用户设备的通知中心或状态栏中显示,以提醒用户有关应用程序的活动、事件或重要信息。 移动应用中的通知可以分为两种类型:本地通知和远程通知。 本地通知是由应用程序自身发起的通知,不需要连接到远程服务器。应用程序可以根据特

鸿蒙HarmonyOS实战-ArkTS语言基础类库(XML)

前言 数据传输的数据格式有以下几种常见的格式: JSON(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,可读性高且易于解析。它使用键值对的方式表示数据,并且支持多层嵌套。 XML(eXtensible Markup Language):XML是一种标

鸿蒙HarmonyOS实战-ArkTS语言基础类库(容器类库)

前言 容器类库是指一组用于存储和管理数据的数据结构和算法。它们提供了各种不同类型的容器,如数组、链表、树、图等,以及相关的操作和功能,如查找、插入、删除、排序等。 容器类库还可以包含其他数据结构和算法,如堆、树、图等,以及相关的操作和功能,如排序、查找、遍历等。它们可以用于解决各种不同的问题和场

鸿蒙HarmonyOS实战-ArkTS语言基础类库(并发)

一、并发 并发是指在一个时间段内,多个事件、任务或操作同时进行或者交替进行的方式。在计算机科学中,特指多个任务或程序同时执行的能力。并发可以提升系统的吞吐量、响应速度和资源利用率,并能更好地处理多用户、多线程和分布式的场景。常见的并发模型有多线程、多进程、多任务、协程等。 1.并发概述 Ha

鸿蒙HarmonyOS实战-ArkTS语言基础类库(概述)

一、概述 1.什么是语言基础类库 语言基础类库,也称为标准库或核心库,是编程语言提供的一组内置的基础功能和常用工具的集合。它通常包含了各种数据结构、算法、输入输出处理、字符串处理、日期时间处理、文件操作、网络通信等功能,为开发者提供了便捷的编程接口,以减少开发工作量并提高代码的可读性和可维护

鸿蒙HarmonyOS实战-Web组件(请求响应和页面调试)

前言 请求响应是指客户端发送请求给服务器,服务器接收到请求后返回的响应。响应包含了服务器处理请求的结果,并将结果返回给客户端。 页面调试是指在开发过程中,通过调试工具分析页面的运行状况,查找问题和修复错误。常用的页面调试工具包括浏览器的开发者工具和调试插件,可以检查页面的网络请求、HTML代码、

鸿蒙HarmonyOS实战-Web组件(Cookie及数据存储)

前言 Cookie是一种存储在用户计算机上的小文本文件,用于在用户访问网站时存储和提取信息。它由网站服务器发送到用户的浏览器,并存储在用户的计算机上。每当用户访问该网站时,浏览器将发送该Cookie回服务器,以用于识别用户和存储用户的首选项和其他信息。 Cookie可以用于跟踪用户的行为,例如记

鸿蒙HarmonyOS实战-Web组件(页面跳转和浏览记录)

前言 页面跳转是指在浏览器中从当前页面跳转到另一个页面的操作。可以通过点击链接、输入网址、提交表单等方式实现页面跳转。 浏览记录是指记录用户在浏览器中浏览过的页面的历史记录。当用户跳转到一个新页面时,该页面会被加入浏览记录中,用户可以通过浏览器的后退按钮或者浏览历史列表来查看和访问之前浏览过的页