HarmonyOS 簡易封裝網絡請求框架

 
 

設計思路

 
網絡請求框架的設計目標是簡化 HTTP 請求的發送和響應處理過程。爲了實現這一目標,我們定義了幾個核心組件:
 
  1. IHttpRequest: 定義了發送 HTTP 請求的基本操作,如設置 URL、請求頭、請求參數等。
  2. IHttpListener: 定義了 HTTP 請求完成後的回調方法,用於處理請求的成功和失敗事件。
  3. HttpTask: 封裝了 HTTP 請求任務,提供了執行請求和處理響應的功能。
  4. JsonHttpRequest 和 JsonHttpListener: 分別實現了 IHttpRequest 和 IHttpListener 接口,用於發送和接收 JSON 格式的 HTTP 請求和響應。
  5. WNetFramework: 提供了靜態方法用於發送 HTTP 請求,進一步簡化了請求的發送和監聽過程。
 

實現細節

 

IHttpListener 和 IDataListener 接口

 
IHttpListener 接口定義了 HTTP 請求完成後的回調方法,包括請求成功和失敗的處理。IDataListener 接口擴展了 IHttpListener,添加了對數據操作成功的處理方法。這兩個接口的泛型 T 允許處理各種類型的數據,使得監聽器能夠靈活地處理不同格式的響應。
IHttpListener:
/**
 * IHttpListener接口定義了HTTP請求完成後的回調方法。
 * 實現此接口的監聽器將被用於處理HTTP請求的成功和失敗事件。
 */
export interface IHttpListener {
  /**
   * 當HTTP請求成功完成時調用此方法。
   * @param result - 請求成功的結果,通常是一個字符串形式的響應數據。
   * 根據實際需求,這個結果可能需要進一步解析以獲取結構化的數據。
   */
  onSuccess(result: string): void;

  /**
   * 當HTTP請求失敗時調用此方法。
   * 失敗的原因可能包括網絡問題、服務器錯誤、請求超時等。
   * 實現此方法的監聽器應該能夠處理這些錯誤情況,例如通過顯示錯誤消息或執行回退操作。
   */
  onFailure(error: any): void;
}
IDataListener:
/**
 * IDataListener接口定義了處理數據成功和失敗事件的監聽器方法。
 * 該接口用於在數據操作(如讀取、寫入、提交等)完成後進行回調。
 * 泛型T表示數據的類型,可以是任何類型,使得監聽器能夠處理特定類型的數據。
 */
export interface IDataListener<T> {

  /**
   * 當數據操作成功完成時調用此方法。
   * 該方法接收操作結果中的數據作爲參數,可以用於更新UI、存儲數據或其他操作。
   * @param t - 數據操作成功後返回的數據。
   */
  onSuccess(t: T): void;

  /**
   * 當數據操作失敗時調用此方法。
   * 該方法同樣接收可能在操作中返回的數據,可以用來了解失敗的原因或進行錯誤處理。
   * @param t - 數據操作失敗時返回的數據或錯誤信息。
   */
  onFailure(t: any): void;

}

 

HttpTask 類

 
HttpTask 類封裝了 HTTP 請求任務,它接收請求的 URL、請求數據、IHttpRequest 實例和 IHttpListener 實例作爲構造函數參數。該類提供了 run 方法用於異步執行 HTTP 請求,並通過 Promise 機制處理請求的完成。
import{ IHttpListener } from'./IHttpListener';
import{ IHttpRequest } from'./IHttpRequest';

/**
 * HttpTask類用於封裝HTTP請求任務,提供執行請求和處理響應的功能。
 * 泛型T用於表示請求數據的類型。
 */
export class HttpTask<T> {
  // IHttpRequest類型的私有成員變量,用於發送HTTP請求和接收響應
  privateiHttpRequest: IHttpRequest;
  // IHttpListener類型的私有成員變量,用於監聽HTTP請求的響應事件
  privateiHttpListener: IHttpListener;

  /**
   * 構造函數接收請求的URL、請求數據、IHttpRequest實例和IHttpListener實例。
   * 通過這些參數初始化HttpTask實例,準備發送HTTP請求。
   * @param url - 請求的目標URL。
   * @param requestData - 要發送的請求數據,可以是任何類型,將被轉換爲JSON格式。
   * @param header - 請求頭。
   * @param body - 請求體。
   * @param iHttpRequest - 實現IHttpRequest接口的請求對象,用於設置請求方法、頭信息等。
   * @param iHttpListener - 實現IHttpListener接口的監聽器對象,用於處理請求的響應。
   */
  constructor(url: string, header: Record<string, string>, requestData: T, iHttpRequest: IHttpRequest,
              iHttpListener: IHttpListener) {
    // 初始化請求對象
    this.iHttpRequest = iHttpRequest;
    // 初始化監聽器對象
    this.iHttpListener = iHttpListener;

    // 設置請求的目標URL
    this.iHttpRequest.setUrl(url);
    // 將監聽器對象綁定到請求對象,以便在請求完成時接收響應
    this.iHttpRequest.setListener(iHttpListener);

    if(header != null) {
      this.iHttpRequest.setHeader(header)
    }

    // 如果提供了請求數據
    if(requestData != null) {
      // 將請求數據轉換爲JSON字符串格式

      letrequestParams: string = JSON.stringify(requestData);
      // 打印請求參數,便於調試
      console.log("HttpTask:" + "  requestParams:" + requestParams);
      // 設置請求參數,這些參數將在請求發送時附加到請求體中
      this.iHttpRequest.setParams(requestParams);
    }
  }

  staticencodeParams(params: { [key: string]: any }): string {
    letresult = Object.keys(params)
      .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(params[key]))
      .join('&');
    returnresult;
  }

  /**
   * 異步執行HTTP請求的方法。
   * 該方法通過調用iHttpRequest的execute方法發送請求,並等待響應。
   * 當execute方法返回的Promise被解決時,該方法完成。
   * @returns 返回一個Promise<void>,表示異步操作的完成。
   */
  asyncrun(): Promise<void> {
    // 調用請求對象的execute方法來發送請求,並等待響應
    awaitthis.iHttpRequest.execute();
  }
}

 

JsonHttpRequest 和 JsonHttpListener 類

 
JsonHttpRequest 類實現了 IHttpRequest 接口,用於發送 JSON 格式的 HTTP 請求。它使用 ohos 的 http 模塊創建和管理 HTTP 請求,並處理請求結果。JsonHttpListener 類實現了 IHttpListener 接口,將 HTTP 響應結果轉換爲泛型類型 T 的對象,並將其傳遞給 IDataListener 接口的實現。
JsonHttpRequest :
importhttp from'@ohos.net.http'; // 引入OhOS的http模塊
import{ IHttpListener } from'./IHttpListener';
import{ IHttpRequest } from'./IHttpRequest';

/**
 * JsonHttpRequest類實現了IHttpRequest接口,用於發送JSON格式的HTTP請求。
 * 該類使用OhOS的http模塊創建和管理HTTP請求,並處理請求結果。
 */
export class JsonHttpRequest implementsIHttpRequest {
  privateurl: string = '';
  privateparams: string = '';
  privateiHttpListener: IHttpListener | null = null; // 存儲請求的監聽器
  privatehttpRequest: http.HttpRequest | null = null; // 存儲OhOS的HttpRequest對象

  /**
   * 構造函數。
   */
  constructor() {
    this.httpRequest = http.createHttp(); // 初始化OhOS的HttpRequest對象
  }

  /**
   * 設置請求的URL。
   * @param url - 要請求的資源的URL字符串。
   */
  setUrl(url: string): void {
    this.url = url;
  }

  /**
   * 設置請求的參數。
   * @param params - 要發送的請求參數。
   */
  setParams(params: string): void {
    this.params = params;
  }

  /**
   * 設置請求的監聽器。
   * @param iHttpListener - 實現IHttpListener接口的監聽器對象。
   */
  setListener(iHttpListener: IHttpListener): void {
    this.iHttpListener = iHttpListener;
  }

  /**
   * 異步執行HTTP請求的方法。
   */
  asyncexecute(): Promise<void> {
    try{
      if(!this.url) {
        thrownewError('URL is not set.');
      }
      if(!this.iHttpListener) {
        thrownewError('HTTP Listener is not set.');
      }

      console.log('JsonHttpRequest: Sending request to:', this.url);

      // 使用GET方法發送請求,並將params作爲請求體發送
      this.httpRequest.request(this.url, {
        method: http.RequestMethod.GET,
        extraData: this.params
      }, (err, data) => {
        if(err) {
          // 請求失敗,調用監聽器的onFailure方法
          console.error('JsonHttpRequest: Request failed:', err);
          this.iHttpListener.onFailure(err);
        } else{
          // 請求成功,調用監聽器的onSuccess方法
          console.log('JsonHttpRequest: Request successful:', data.result);
          this.iHttpListener.onSuccess(data.result.toString());
        }
        // 請求完成後,主動銷燬請求對象以釋放資源
        this.httpRequest.destroy();
      });
    } catch(error) {
      console.error('JsonHttpRequest: An error occurred:', error);
      if(this.iHttpListener) {
        this.iHttpListener.onFailure(error);
      }
    }
  }
}

 

JsonHttpListener :
import{ IDataListener } from'./IDataListener';
import{ IHttpListener } from'./IHttpListener';

/**
 * JsonHttpListener類實現了IHttpListener接口,用於處理HTTP請求的響應。
 * 它將HTTP響應結果轉換爲泛型類型T的對象,並將其傳遞給IDataListener接口的實現。
 * 泛型T允許處理各種類型的數據,使得監聽器能夠靈活地處理不同格式的響應。
 */
export class JsonHttpListener<T> implements IHttpListener {
  // 存儲IDataListener接口的實現,用於回調數據給調用者
  privateiDataListener: IDataListener<T>;

  /**
   * 構造函數接收一個IDataListener接口的實現。
   * @param iDataListener - 實現IDataListener接口的監聽器對象。
   */
  constructor(iDataListener: IDataListener<T>) {
    this.iDataListener = iDataListener;
  }

  /**
   * 當HTTP請求成功時調用此方法。
   * 該方法接收原始的響應字符串,並嘗試將其解析爲泛型類型T的對象。
   * 解析成功後,調用IDataListener的onSuccess方法,並將解析後的對象作爲參數傳遞。
   * @param result - HTTP響應的原始字符串。
   */
  onSuccess(result: string): void {
    try{
      // 嘗試將響應字符串解析爲泛型類型T的對象
      letresultObj: T = JSON.parse(result) asT;

      // 打印原始響應字符串
      console.log("JsonHttpListener  result:" + result);

      // 將解析後的數據通過IDataListener的onSuccess方法回調給調用者
      this.iDataListener.onSuccess(resultObj);
    } catch(error) {
      // 如果解析失敗,打印錯誤信息並調用onFailure方法
      console.error("Error parsing JSON response:", error);
      // 調用失敗處理方法
      this.onFailure(error);
    }
  }

  /**
   * 當HTTP請求失敗時調用此方法。
   * 由於當前實現中沒有處理失敗情況的邏輯,所以此方法會拋出一個錯誤。
   * 實際使用時,應根據需要實現失敗處理邏輯。
   */
  onFailure(error: any): void {
    // 這裏可以添加失敗處理邏輯,例如記錄錯誤日誌或者通知用戶
    console.error("HTTP request failed:", error.message);
    if(this.iDataListener) {
      // 通知IDataListener接口的實現,請求失敗
      this.iDataListener.onFailure(error);
    }
  }
}

 

WNetFramework 類

 
WNetFramework 類提供了靜態方法用於發送 JSON 格式的 HTTP 請求。它通過封裝請求任務和監聽器,簡化了網絡請求的發送和處理過程。泛型 T 表示請求參數的類型,而泛型 M 表示響應數據的類型。
importhttp from'@ohos.net.http';
import{ HttpTask } from'./HttpTask';
import{ IDataListener } from'./IDataListener';
import{ IHttpListener } from'./IHttpListener';
import{ IHttpRequest } from'./IHttpRequest';
import{ JsonHttpListener } from'./JsonHttpListener';
import{ JsonHttpRequest } from'./JsonHttpRequest';

/**
 * JettNetFramework類提供了一個靜態方法用於發送JSON格式的HTTP請求。
 * 該類通過封裝請求任務和監聽器,簡化了網絡請求的發送和處理過程。
 * 泛型T表示請求參數的類型,而泛型M表示響應數據的類型。
 */
export class WNetFramework<T, M> {

  /**
   * 靜態方法,用於發送JSON格式的HTTP請求。
   * @param url - 請求的目標URL。
   * @param header - 請求頭。
   * @param requestParams - 請求的參數,類型爲泛型T。
   * @param iDataListener - 實現IDataListener接口的監聽器,用於接收請求結果,類型爲泛型M。
   */
  staticget<T, M>(url: string, header: Record<string, string>, requestParams: T, iDataListener:
    IDataListener<M>) {
    // 創建JsonHttpRequest對象,用於發送HTTP請求
    letiHttpRequest: IHttpRequest = newJsonHttpRequest();
    // 創建JsonHttpListener對象,用於處理HTTP請求的響應
    letiHttpListener: IHttpListener = newJsonHttpListener<M>(iDataListener);
    // 創建HttpTask對象,封裝請求任務
    lethttpTask: HttpTask<T> = newHttpTask(url, header, requestParams, iHttpRequest, iHttpListener);
    // 執行請求任務
    httpTask.run().catch(error => {
      // 調用監聽器的onFailure方法,通知請求失敗
      iDataListener.onFailure(error);
    });
  }

  staticpost<T, M>(url: string, header: Record<string, string>, requestParams: T, iDataListener: IDataListener<M>) {
    // 創建JsonHttpRequest對象,用於發送HTTP請求
    letiHttpRequest: IHttpRequest = newJsonHttpRequest();

    iHttpRequest.setRequestMethod(http.RequestMethod.POST)

    // 創建JsonHttpListener對象,用於處理HTTP請求的響應
    letiHttpListener: IHttpListener = newJsonHttpListener<M>(iDataListener);

    // 創建HttpTask對象,封裝請求任務
    lethttpTask: HttpTask<T> = newHttpTask(url, header, requestParams, iHttpRequest, iHttpListener);

    // 執行請求任務
    httpTask.run().catch(error => {
      // 調用監聽器的onFailure方法,通知請求失敗
      iDataListener.onFailure(error);
    });
  }
}

 

使用示例

 
以下是一個使用 WNetFramework 發送 GET 請求的示例:
 
WNetFramework.get<RequestBean, WeatherResponse>(url, headers, null, {
  onSuccess(result: WeatherResponse) {
    console.log("WNetFramework: onSuccess(result:ResponceBean)==>>" + JSON.stringify(result.result));
  }, onFailure(error) {
    console.log("WNetFramework: onFailure(msg)==>>" + JSON.stringify(error.message));
  }
});

 

總結

 
通過封裝網絡請求處理框架,我們可以大大簡化網絡請求的發送和響應處理過程。本框架的設計和實現展示瞭如何使用 TypeScript 的泛型和接口來創建靈活且可擴展的代碼。提高開發效率,使代碼更加易於維護和擴展。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章