超级好用的批量插件网络请求

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 超级好用的批量插件网络请求

熟悉swift的朋友应该都知道一款优秀的三方库Moya,插件版网络请求是真香,于是乎借鉴思路制作一款纯oc版本的插件网络请求库


熟悉oc的朋友又应该都知道一款优秀的三方库YTKNetwork,基于对象的协议版网络请求,然后他的批量网络请求和链式网络请求也超级香


结合一下两者优点,制作一款批量链式插件版网络请求库


功能清单


插件版网络请求可以更方便快捷的定制专属网络请求,并且支持批量操作,链式操作


主要功能清单如下:

支持基本的网络请求,下载上传文件

支持配置通用请求跟路径,通用参数等

支持设置加载和提示框插件

支持解析结果插件

支持网络缓存插件

支持配置自建证书插件

支持修改请求体和获取响应结果插件

支持网络日志抓包插件

支持批量操作

支持链式网络请求


使用教程


基本使用教程

插件使用教程

批量网络使用教程

链式网络使用教程


模块组成


KJNetworkPlugin是一款基于面向协议的网络抽象层的插件版网络请求库,基于AFNetworking的基础上再次封装使用。简单讲应该分为这么几大板块:


Chain:链式插件版网络请求

Batch:批量插件版网络请求

Network:插件管理器和网络请求基类

Manager:插件网络二次封装,方便快捷使用上传资源或者网络插件处理等

Plugins:插件集合,目前已有6款插件供使用

Loading:加载错误提示插件

Anslysis:数据解析插件

Cache:缓存插件

Certificate:自建证书插件

Thief:修改器插件

Capture:网络日志抓包插件


Network版块


KJBaseNetworking:网络请求基类,基于 AFNetworking 封装使用

这里也提供两个入口,设置通用的根路径和通用参数,类似:userID,token等

/// 根路径地址
@property (nonatomic, strong, class) NSString *baseURL;
/// 基本参数,类似:userID,token等
@property (nonatomic, strong, class) NSDictionary *baseParameters;

封装的有基本的网络请求,上传下载文件等方法

KJNetworkingRequest:请求体,设置网络请求相关参数,其中包含参数,请求方式,插件等等

KJNetworkingResponse:响应请求结果,获取插件之间产生的数据等等

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插件集合


插件使用教程

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

KJNetworkLoadingPlugin:基于MBProgressHUD封装的加载框和错误提示框插件

KJNetworkAnslysisPlugin:基于MJExtension封装的解析数据插件

KJNetworkCachePlugin:基于YYCache封装的网络缓存插件

KJNetworkCertificatePlugin:配置自建证书插件

KJNetworkThiefPlugin:修改KJNetworkingRequest和获取 KJNetworkingResponse插件

KJNetworkCapturePlugin:网络日志抓包插件


Chain链式插件网络


链式网络请求其实主要用于管理有相互依赖的网络请求,它实际上最终可以用来管理多个拓扑排序后的网络请求。

例如,我们有一个需求,需要用户先发送注册Api,然后获取用户信息Api,最后再获取用户id等信息。


链式插件方案


方案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));


使用教程


方案1:采用不定参数方式处理

使用说明:

实例化第一个网络请求体request,获取到数据回调在chain,然后解析return给第二个网络请求体request,然后依次类推,最终以**nil**结尾即可。


**success回调:**可拿到全部网络响应数据,目录和请求顺序一致

**failure回调:**只要当中某一个网络失败,即响应失败

测试用例:

// 测试不定参数方式链式网络请求
- (void)testMoreChainNetworking{
    XCTestExpectation * expectation = [self expectationWithDescription:@"test more chain."];
    KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
    request.method = KJNetworkRequestMethodGET;
    request.ip = @"https://www.douban.com";
    request.path = @"/j/app/radio/channels";
    request.responseSerializer = KJSerializerJSON;
    [KJNetworkChainManager HTTPChainRequest:request success:^(NSArray<id> * _Nonnull responseArray) {
        NSLog(@"----%@",responseArray);
        [expectation fulfill];
    } failure:^(NSError * _Nonnull error) {
        XCTFail(@"%@", error.localizedDescription);
    } chain:^__kindof KJNetworkingRequest * _Nullable(id  _Nonnull responseObject) {
        NSArray * array = responseObject[@"channels"];
        NSDictionary * dict = array[arc4random() % array.count];
        KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
        request.method = KJNetworkRequestMethodGET;
        request.ip = @"https://www.douban.com";
        request.path = [@"/j/app/radio/channels/channel_id=" stringByAppendingFormat:@"%@",dict[@"channel_id"]];
        request.responseSerializer = KJSerializerJSON;
        return request;
    }, ^__kindof KJNetworkingRequest * _Nullable(id  _Nonnull responseObject) {
        KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
        request.method = KJNetworkRequestMethodGET;
        request.ip = @"https://www.douban.com";
        request.path = @"/j/app/radio/channels";
        request.responseSerializer = KJSerializerJSON;
        return request;
    }, ^__kindof KJNetworkingRequest * _Nullable(id  _Nonnull responseObject) {
        NSArray * array = responseObject[@"channels"];
        NSDictionary * dict = array[arc4random() % array.count];
        KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
        request.method = KJNetworkRequestMethodGET;
        request.ip = @"https://www.douban.com";
        request.path = [@"/j/app/radio/channels/channel_id=" stringByAppendingFormat:@"%@",dict[@"channel_id"]];
        request.responseSerializer = KJSerializerJSON;
        return request;
    }, nil];
    [self waitForExpectationsWithTimeout:300 handler:nil];
}

方案2:采用链式闭包方式处理

使用说明:

实例化第一个网络请求体request,然后通过链式闭包方式chain获取到上一个响应结果,然后return第二个网络请求体request,依次类推,最后一个网络请求响应结果则通过lastChain获取responseObject 即可。


**failure回调:**只要当中某一个网络失败,即响应失败

测试用例:

// 测试链式网络请求
- (void)testChainNetworking{
    XCTestExpectation * expectation = [self expectationWithDescription:@"test chain."];
    KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
    request.method = KJNetworkRequestMethodGET;
    request.ip = @"https://www.douban.com";
    request.path = @"/j/app/radio/channels";
    request.responseSerializer = KJSerializerJSON;
    [KJNetworkChainManager HTTPChainRequest:request failure:^(NSError * _Nonnull error) {
        XCTFail(@"%@", error.localizedDescription);
    }].chain(^__kindof KJNetworkingRequest * _Nullable(id  _Nonnull responseObject) {
        NSArray * array = responseObject[@"channels"];
        NSDictionary * dict = array[arc4random() % array.count];
        KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
        request.method = KJNetworkRequestMethodGET;
        request.ip = @"https://www.douban.com";
        request.path = [@"/j/app/radio/channels/channel_id=" stringByAppendingFormat:@"%@",dict[@"channel_id"]];
        request.responseSerializer = KJSerializerJSON;
        return request;
    }).lastChain(^(id  _Nonnull responseObject) {
        NSLog(@"----%@",responseObject);
        [expectation fulfill];
    });
    [self waitForExpectationsWithTimeout:300 handler:nil];
}

大致介绍就差不多这么多吧,其实这类网络使用一般都是在个人中心


Cocoapods安装


pod 'KJNetworkPlugin/Chain'


Batch批量插件网络


关于批量网络请求,平时使用的场景是非常之多,于是乎就封装该批量插件版网络请求,下面介绍一下使用技巧。


这里主要分为两个大类:

**KJBatchConfiguration:**配置文件,这里包括网络请求最大并发数,最大失败重连次数,失败重连时机和批量网络请求体

/// 设置网络并发最大数量,默认5条
@property (nonatomic, assign) NSInteger maxQueue;
/// 设置最大失败重调次数,默认3次
@property (nonatomic, assign) NSInteger againCount;
/// 网络连接失败重连时机,默认 KJBatchReRequestOpportunityNone
@property (nonatomic, assign) KJBatchReRequestOpportunity opportunity;
/// 批量请求体,
@property (nonatomic, strong) NSArray<__kindof KJNetworkingRequest *> * requestArray;

**KJNetworkBatchManager:**批量网络请求管理器


API说明


批量插件网络请求,这里提供设置最大并发数量,失败调用次数,错误重连时机等配置信息

/// 批量网络请求
/// @param configuration 批量请求配置信息
/// @param reconnect 网络请求失败时候回调,返回YES再次继续批量处理
/// @param complete 最终结果回调,返回成功和失败数据数组
+ (void)HTTPBatchRequestConfiguration:(KJBatchConfiguration *)configuration
                            reconnect:(KJNetworkBatchReconnect)reconnect
                             complete:(KJNetworkBatchComplete)complete;


测试用例


实例化设置配置文件KJBatchConfiguration,然后传入我们需要批量操作的请求体request,批量结果显示在complete回调。

关于reconnect回调,这里说明一下,存在失败网络时刻,会先记录下来然后回调出来,**retuen yes**则再次请求失败的网络。

// 测试批量网络请求
- (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];
    }{
        KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
        request.method = KJNetworkRequestMethodGET;
        request.path = @"/user-agent";
        [array addObject:request];
    }{
        KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
        request.method = KJNetworkRequestMethodGET;
        request.path = @"/bearer";
        request.responseSerializer = KJSerializerJSON;
        [array addObject:request];
    }{
        KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
        request.method = KJNetworkRequestMethodGET;
        request.path = @"/cache";
        request.responseSerializer = KJSerializerJSON;
        [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) {
        NSLog(@"----%@",result);
        [expectation fulfill];
    }];
    [self waitForExpectationsWithTimeout:300 handler:nil];
}

具体使用,可以下载Demo查看测试用例


Cocoapods安装


pod 'KJNetworkPlugin/Batch' # 批量插件版网络请求


Demo地址


KJNetworkPlugin,感兴趣的老哥可以去下载玩玩

相关文章
|
Kubernetes 负载均衡 安全
【K8S系列】深入解析k8s 网络插件—kube-router
【K8S系列】深入解析k8s 网络插件—kube-router
1273 1
|
canal Kubernetes 关系型数据库
【K8S系列】深入解析k8s网络插件—Canal
【K8S系列】深入解析k8s网络插件—Canal
1795 0
|
Kubernetes 负载均衡 安全
【K8S系列】深入解析k8s网络插件—Cilium
【K8S系列】深入解析k8s网络插件—Cilium
1060 1
|
7月前
|
Kubernetes Cloud Native Docker
云原生|kubernetes|网络插件flannel二进制部署和calico的yaml清单部署总结版
云原生|kubernetes|网络插件flannel二进制部署和calico的yaml清单部署总结版
858 0
|
7月前
|
Kubernetes 应用服务中间件 Docker
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
|
3月前
|
Kubernetes 容器 Perl
Kubernetes网络插件体系及flannel基础
文章主要介绍了Kubernetes网络插件体系,特别是flannel网络模型的工作原理、配置和测试方法。
118 3
Kubernetes网络插件体系及flannel基础
|
4月前
|
存储 canal Kubernetes
在K8S中,什么是CNI?平时K8s集群常用什么网络插件?
在K8S中,什么是CNI?平时K8s集群常用什么网络插件?
|
4月前
|
大数据 RDMA
神龙大数据加速引擎MRACC问题之MRACC-Spark利用eRDMA近网络优化插件来提升性能如何解决
神龙大数据加速引擎MRACC问题之MRACC-Spark利用eRDMA近网络优化插件来提升性能如何解决
46 0
|
5月前
|
缓存 安全 Web App开发
Chrome插件实现问题之网络进程接收到URL请求后会如何解决
Chrome插件实现问题之网络进程接收到URL请求后会如何解决
|
6月前
|
安全 数据可视化 JavaScript
【内网安全】域信息收集&应用网络凭据&CS插件&Adfind&BloodHound
【内网安全】域信息收集&应用网络凭据&CS插件&Adfind&BloodHound
105 1