在軟體開發中,底層庫的更換或升級是常見的需求,這可能由效能提升、新功能需求或安全性考慮等因素驅動。為了降低遷移成本,良好的設計模式至關重要。
在版本迭代過程中,網路請求庫可能會經歷從A到B再到C的演進。為了實現業務層的無感切換,需要在各個請求庫和業務程式碼之間封裝隔離程式碼,以實現第三方網路庫的靈活更換。
回撥介面 (ICallback)
定義了ICallback
介面,包含onSuccess
和onFailure
兩個方法,用於處理非同步操作的成功和失敗情況。
/**
* 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
介面定義了post
和get
兩個方法,用於傳送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));
}
}));