美文网首页
插件版网络请求设计使用技巧

插件版网络请求设计使用技巧

作者: 弹吉他的少年 | 来源:发表于2021-09-24 09:32 被阅读0次

    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

    后面有相关插件我也会慢慢补充...

    相关文章

      网友评论

          本文标题:插件版网络请求设计使用技巧

          本文链接:https://www.haomeiwen.com/subject/jpoagltx.html