插件版網絡請求設計使用技巧 KJNetworkPluginManager

KJNetworkPluginManager

  • 熟悉swift的朋友應該都知道一款優秀的三方庫Moya,插件版網絡請求是真香,於是乎借鑑思路製作一款純oc版本的插件網絡請求庫
  • 熟悉oc的朋友又應該都知道一款優秀的三方庫YTKNetwork,基於對象的協議版網絡請求,然後他的批量網絡請求和鏈式網絡請求也超級香
  • 結合一下兩者優點,製作一款 批量鏈式 插件版網絡請求庫

[圖片上傳失敗...(image-2f45f2-1632447132641)]

KJNetworkPlugin模塊組成

KJNetworkPlugin是一款基於面向協議的網絡抽象層的插件版網絡請求庫,基於AFNetworking的基礎上再次封裝使用。簡單講應該分爲這麼幾大板塊:

  • Chain:鏈式插件版網絡請求
  • Batch:批量插件版網絡請求
  • Network:插件管理器和網絡請求基類
  • Plugins:插件集合,目前已有5款插件供使用
    • Loading:加載錯誤提示插件
    • Anslysis:數據解析插件
    • Cache:緩存插件
    • Certificate:自建證書插件
    • Thief:修改器插件

其實還有上傳日誌插件和加密解密插件等等,由於和項目耦合度比較高,暫時不考慮分享,後面我會提供思路,大家可以根據思路去封裝屬於自己的專屬插件

Network版塊

  • KJBaseNetworking:網絡請求基類,基於 AFNetworking 封裝使用

這裏也提供兩個入口,設置通用的根路徑和通用參數,類似:userID,token等

/// 根路徑地址
@property (nonatomic, strong, class) NSString *baseURL;
/// 基本參數,類似:userID,token等
@property (nonatomic, strong, class) NSDictionary *baseParameters;

封裝的有基本的網絡請求,上傳下載文件等方法

  • KJNetworkingRequest:請求體,設置網絡請求相關參數,其中包含參數,請求方式,插件等等
/// 設置請求數據格式,默認 KJSerializerHTTP
@property (nonatomic, assign) KJSerializer requestSerializer;
/// 設置響應數據格式,默認 KJSerializerHTTP
@property (nonatomic, assign) KJSerializer responseSerializer;
/// 設置超時時間,默認30秒
@property (nonatomic, assign) NSTimeInterval timeoutInterval;
/// 默認請求頭
@property (nonatomic, strong) NSDictionary *header;
/// 插件數組
@property (nonatomic, strong) NSArray<id<KJNetworkDelegate>>*plugins;
/// 請求類型,默認 KJNetworkRequestMethodPOST
@property (nonatomic, assign) KJNetworkRequestMethod method;
/// 根路徑地址,默認 [KJBaseNetworking baseURL] 設置的根路徑地址
@property (nonatomic, strong, nullable) NSString *ip;
/// 網絡請求路徑
@property (nonatomic, strong) NSString *path;
/// 請求參數
@property (nonatomic, strong, nullable) id params;
/// 加密參數,不涉及加密時刻該數據與上面一致
@property (nonatomic, strong, readonly) id secretParams;
/// 網址請求地址
@property (nonatomic, strong, readonly) NSString *URLString;

/// 網絡請求插件時機,配合 `KJNetworkThiefPlugin` 插件使用效果極佳
@property (nonatomic, assign, readonly) KJRequestOpportunity opportunity;

/// 請求體標識符號,唯一標識
@property (nonatomic, strong, readonly) NSString *requestIdentifier;

/// 上傳資源文件,需要使用時刻需要實例化該對象
@property (nonatomic, strong, nullable) KJConstructingBody *constructingBody;

/// 下載文件,需要使用時刻需要實例化該對象
@property (nonatomic, strong, nullable) KJDownloadBody *downloadBody;

後面的批量和鏈式網絡請求,也需要繼承該基類然後設計點高級用法,後面有空我再慢慢寫文章分享,期待您的關注

  • KJNetworkingResponse:響應請求結果,這個類應該基本都是插件庫內部使用或者KJNetworkThiefPlugin插件用到,獲取插件之間產生的數據等等

  • KJNetworkingType:彙總所有枚舉和回調聲明

  • KJNetworkingDelegate:插件協議,目前抽離出以下5條協議方法,其中大致分爲開始時刻、網絡請求時刻、網絡成功、網絡失敗、最終返回

/// 開始準備網絡請求
/// @param request 請求相關數據
/// @param endRequest 是否結束下面的網絡請求
/// @return 返回準備插件處理後的數據
- (KJNetworkingResponse *)prepareWithRequest:(KJNetworkingRequest *)request endRequest:(BOOL *)endRequest;

/// 網絡請求開始時刻請求
/// @param request 請求相關數據
/// @param stopRequest 是否停止網絡請求
/// @return 返回網絡請求開始時刻插件處理後的數據
- (KJNetworkingResponse *)willSendWithRequest:(KJNetworkingRequest *)request stopRequest:(BOOL *)stopRequest;

/// 成功接收數據
/// @param request  接收成功數據
/// @param againRequest 是否需要再次請求該網絡
/// @return 返回成功插件處理後的數據
- (KJNetworkingResponse *)succeedWithRequest:(KJNetworkingRequest *)request againRequest:(BOOL *)againRequest;

/// 失敗處理
/// @param request  失敗的網絡活動
/// @param againRequest 是否需要再次請求該網絡
/// @return 返回失敗插件處理後的數據
- (KJNetworkingResponse *)failureWithRequest:(KJNetworkingRequest *)request againRequest:(BOOL *)againRequest;

/// 準備返回給業務邏輯時刻調用
/// @param request 請求相關數據
/// @param error 錯誤信息
/// @return 返回最終加工之後的數據
- (KJNetworkingResponse *)processSuccessResponseWithRequest:(KJNetworkingRequest *)request error:(NSError **)error;
  • KJNetworkBasePlugin:插件基類,插件父類

  • KJNetworkPluginManager:插件管理器,中樞神經,其實也就這麼一個方法供外界調用

/// 插件版網絡請求
/// @param request 請求體
/// @param success 成功回調
/// @param failure 失敗回調
+ (void)HTTPPluginRequest:(KJNetworkingRequest *)request success:(KJNetworkPluginSuccess)success failure:(KJNetworkPluginFailure)failure;

Plugins插件集合

目前已有5款插件供使用:

  • KJNetworkLoadingPlugin:基於MBProgressHUD封裝的加載框和錯誤提示框插件

  • KJNetworkAnslysisPlugin:基於MJExtension封裝的解析數據插件

  • KJNetworkCachePlugin:基於YYCache封裝的網絡緩存插件

  • KJNetworkCertificatePlugin:配置自建證書插件

  • KJNetworkThiefPlugin:修改KJNetworkingRequest和獲取 KJNetworkingResponse插件

後面有空我再來一一介紹每種插件設計思路和使用方式

Chain鏈式插件網絡

鏈式網絡請求,關於如何使用後面再寫文章,期待您的持續關注

這邊目前封裝兩套使用鏈式插件方案,

  • 方案1:採用自定義參數方式處理
/// 鏈式網絡請求
/// @param request 請求體系
/// @param success 全部成功回調,存放請求所有結果數據
/// @param failure 失敗回調,只要一個失敗就會響應
/// @param chain 鏈式回調,返回下個網絡請求體,爲空時即可結束後續請求,responseObject上個網絡請求響應數據
+ (void)HTTPChainRequest:(__kindof KJNetworkingRequest *)request
                 success:(KJNetworkChainSuccess)success
                 failure:(KJNetworkChainFailure)failure
                   chain:(KJNetworkNextChainRequest)chain,...;
  • 方案2:採用鏈式閉包方式處理
/// 鏈式網絡請求,需 `chain` 和 `lastchain` 配合使用
/// @param request 請求體系
/// @param failure 失敗回調,只要一個失敗就會響應
/// @return 返回自身對象
+ (instancetype)HTTPChainRequest:(__kindof KJNetworkingRequest *)request failure:(KJNetworkChainFailure)failure;
/// 請求體傳遞載體,回調返回上一個網絡請求結果
@property (nonatomic, copy, readonly) KJNetworkChainManager * (^chain)(KJNetworkNextChainRequest);
/// 最後鏈數據回調,回調最後一個網絡請求結果
@property (nonatomic, copy, readonly) void(^lastChain)(void(^)(id responseObject));

Batch批量插件網絡

批量插件網絡請求,這裏提供設置最大併發數量,失敗調用次數,錯誤重連時機等配置信息

/// 批量網絡請求
/// @param configuration 批量請求配置信息
/// @param reconnect 網絡請求失敗時候回調,返回YES再次繼續批量處理
/// @param complete 最終結果回調,返回成功和失敗數據數組
+ (void)HTTPBatchRequestConfiguration:(KJBatchConfiguration *)configuration
                            reconnect:(KJNetworkBatchReconnect)reconnect
                             complete:(KJNetworkBatchComplete)complete;

結尾介紹

pod 安裝使用

pod 'KJNetworkPlugin' # 插件版網絡
pod 'KJNetworkPlugin/Batch' # 批量插件網絡請求
pod 'KJNetworkPlugin/Chain' # 鏈式插件網絡請求
pod 'KJNetworkPlugin/Loading'
pod 'KJNetworkPlugin/Cache'
pod 'KJNetworkPlugin/Thief'
pod 'KJNetworkPlugin/Anslysis'
pod 'KJNetworkPlugin/Certificate'

寫東西着實累,老鐵們覺得有用還望點個星支持一下,傳送門KJNetworkPlugin

後面有相關插件我也會慢慢補充...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章