• HarmonyOS 鸿蒙隔离层设计


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

    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 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, 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, 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, callback: ICallback): void {
    
        let headers: Record = {
          "X-APISpace-Token": 'X-APISpace-Token信息',
          "Content-Type": 'application/x-www-form-urlencoded',
        };
        HttpManager.getInstance().request({
          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({
          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 = new Map();
    params.set('pageSize', '5')
    params.set('page', '1')
    HttpHelper.obtain().post(postURL, params, new (class Http extends HttpCallback {
      onParsedSuccess(tongue: Tongue): void {
        console.log("tongue==========" + JSON.stringify(tongue));
      }
    }));
    
  • 相关阅读:
    Python连本地MySQL接数据库
    SAP 内向交货单报表
    民国漫画杂志《时代漫画》第31期.PDF
    实战PyQt5: 155-QChart图表之极坐标图表
    Linux中使用nvidia-smi命令实时查看指定GPU使用情况
    java-net-php-python-ssm巴音学院本科部校园网站计算机毕业设计程序
    Windows安装Ubuntu、Docker
    从 WebStorm 转到 VSCode!使用一周体验报告
    新兴国家战略级安全话题-软件供应链安全
    零基础想系统地学习金融学、量化投资、数据分析、python,需要哪些课程、书籍?有哪些证书可以考?
  • 原文地址:https://www.cnblogs.com/androidsuperman/p/18160848