插件版网络请求架构,支持批量操作和链式操作
熟悉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:错误提示插件
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的小伙伴还是使用RxNetworks
再附上一个开发加速库KJCategoriesDemo地址 🎷 喜欢的老板们可以点个星🌟
End .🎷