設計思路
- IHttpRequest: 定義了發送 HTTP 請求的基本操作,如設置 URL、請求頭、請求參數等。
- IHttpListener: 定義了 HTTP 請求完成後的回調方法,用於處理請求的成功和失敗事件。
- HttpTask: 封裝了 HTTP 請求任務,提供了執行請求和處理響應的功能。
- JsonHttpRequest 和 JsonHttpListener: 分別實現了 IHttpRequest 和 IHttpListener 接口,用於發送和接收 JSON 格式的 HTTP 請求和響應。
- WNetFramework: 提供了靜態方法用於發送 HTTP 請求,進一步簡化了請求的發送和監聽過程。
實現細節
IHttpListener 和 IDataListener 接口
/** * 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 類
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 類
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); } } } }
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 類
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<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)); } });