插件版網絡請求架構,支持批量操作和鏈式操作
熟悉swift的朋友應該都知道一款優秀的三方庫Moya,插件版網絡請求是真香,於是乎借鑑思路製作一款純oc版本的插件網絡請求庫
熟悉oc的朋友又應該都知道一款優秀的三方庫YTKNetwork,基於對象的協議版網絡請求,然後他的批量網絡請求和鏈式網絡請求也超級香
結合兩者部分優點,製作一款純OC版 批量 和 鏈式 插件版網絡請求庫。
目前整理九款插件:解析插件,緩存插件,配置自建證書插件,加載提示插件,修改請求插件,日誌抓包插件,錯誤碼插件,刷新插件,網絡錯誤和空數據插件
功能清單
插件版網絡請求可以更方便快捷的定製專屬網絡請求,並且支持批量操作,鏈式操作
主要功能清單如下:
- 支持基本的網絡請求,下載上傳文件
- 支持配置通用請求跟路徑,通用參數等
- 支持設置加載和提示框插件
- 支持解析結果插件
- 支持網絡緩存插件
- 支持配置自建證書插件
- 支持修改請求體和獲取響應結果插件
- 支持網絡日誌抓包插件
- 支持刷新加載更多插件
- 支持錯誤碼解析插件
- 支持錯誤和空數據UI展示插件
- 支持批量操作
- 支持鏈式網絡請求
使用教程
Network版塊
KJBaseNetworking:網絡請求基類,基本的網絡請求,上傳下載文件等方法
/// 根路徑地址
@property (nonatomic, strong, class) NSString *baseURL;
/// 基本參數,類似:userID,token等
@property (nonatomic, strong, class) NSDictionary *baseParameters;
KJNetworkingRequest:請求體,設置網絡請求相關參數,其中包含參數,請求方式,插件等等
KJNetworkingResponse:響應請求結果,獲取插件之間產生的數據等等
KJNetworkingType:彙總所有枚舉和回調聲明
KJNetworkBasePlugin:插件基類,插件父類
KJNetworkPluginManager:插件管理器,中樞神經
/// 插件版網絡請求
/// @param request 請求體
/// @param success 成功回調
/// @param failure 失敗回調
+ (void)HTTPPluginRequest:(KJNetworkingRequest *)request
success:(KJNetworkPluginSuccess)success
failure:(KJNetworkPluginFailure)failure;
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;
Plugins
目前已有13款插件供使用:
- KJNetworkLoadingPlugin:加載動畫插件
- KJNetworkAnslysisPlugin:解析數據插件
- KJNetworkCachePlugin:網絡緩存插件
- KJNetworkCertificatePlugin:配置自建證書插件
- KJNetworkThiefPlugin:資源修改器插件
- KJNetworkCapturePlugin:網絡日誌抓包插件
- KJNetworkCodePlugin:錯誤碼解析插件
- KJNetworkRefreshPlugin:刷新加載更多插件
- KJNetworkEmptyPlugin:錯誤信息和空數據UI展示插件
- KJNetworkIndicatorPlugin:指示器插件
- KJNetworkWarningPlugin:錯誤提示插件
- KJNetworkSecretPlugin:密鑰插件
- KJNetworkZipPlugin:解壓縮插件
Chain
- 鏈式網絡請求其實主要用於管理有相互依賴的網絡請求,它實際上最終可以用來管理多個拓撲排序後的網絡請求。
// 測試鏈式網絡請求
- (void)testChainNetworking{
XCTestExpectation * expectation = [self expectationWithDescription:@"test chain."];
KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
request.method = KJNetworkRequestMethodGET;
request.ip = @"https://www.httpbin.org";
request.path = @"/ip";
request.responseSerializer = KJSerializerJSON;
[KJNetworkChainManager HTTPChainRequest:request failure:^(NSError * error) {
XCTFail(@"%@", error.localizedDescription);
}]
.chain(^__kindof KJNetworkingRequest * _Nullable(id _Nonnull responseObject) {
KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
request.ip = @"https://www.httpbin.org";
request.path = @"/post";
request.params = {
"ip": responseObject["origin"]
};
return request;
})
.lastChain(^(id _Nonnull responseObject) {
[expectation fulfill];
});
[self waitForExpectationsWithTimeout:300 handler:nil];
}
Batch
- 關於批量網絡請求,提供設置最大併發數量,失敗調用次數,錯誤重連時機等配置信息
// 測試批量網絡請求
- (void)testBatchNetworking{
XCTestExpectation * expectation = [self expectationWithDescription:@"test batch."];
NSMutableArray * array = [NSMutableArray array];
{
KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
request.method = KJNetworkRequestMethodGET;
request.path = @"/headers";
request.responseSerializer = KJSerializerJSON;
[array addObject:request];
}{
KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
request.method = KJNetworkRequestMethodGET;
request.path = @"/ip";
[array addObject:request];
}
KJBatchConfiguration * configuration = [KJBatchConfiguration sharedBatch];
configuration.maxQueue = 3;
configuration.requestArray = array.mutableCopy;
[KJNetworkBatchManager HTTPBatchRequestConfiguration:configuration reconnect:^BOOL(NSArray<KJNetworkingRequest *> * _Nonnull reconnectArray) {
return YES;
} complete:^(NSArray<KJBatchResponse *> * _Nonnull result) {
[expectation fulfill];
}];
[self waitForExpectationsWithTimeout:300 handler:nil];
}
最後
- 搞OC的小夥伴們推薦使用該插件KJNetworkPlugin,搞Siwft的小夥伴還是使用Moya吧,是真的香。
- 再附上一個開發加速庫,簡簡單單的如此便利 .🎷
- KJCategoriesDemo地址 🎷 喜歡的老闆們可以點個小星星.
- 等我有時間空閒再來封裝一套響應式插件網絡請求吧,所以老闆們覺得有幫助還望點個星🌟。
- 傳送門:KJNetworkPluginDemo
- End .🎷