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<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));
  }
}));
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章