在iOS开发中,对于网络请求的封装,大部分人用的都是AFNetworking
。对其的二次封装也有不少。前段时间,刚刚需要重构公司的APP,所以就重构了下网络请求。
先放代码:XTNetworking
XTNetworking
主要是使用了AFNetworking
作为网络请求。YYCache
做为缓存。这两部分,如果项目里面已经存在可以不做添加。
主要的文件:
网络库常用配置管理类(可以根据自己的需求自定义)。主要使用配置整个网络请求的配置信息。比如用户的登录code,全局控制是否打印请求结果等。
这是所有请求类的封装,里面包含了请求的设置、请求方法、以及数据处理。也是整个库的核心
1、以下的属性都是设置当前的网络请求。
/** 请求的缓存类型,默认不使用缓存 */
@property (nonatomic, assign) XTApiRequestCacheType cacheType;
/** 是否开启返回结果打印,默认关闭 */
@property (nonatomic, assign) BOOL isOpenResultLog;
/** 移除通用参数,默认不移除 */
@property (nonatomic, assign) BOOL removeCommonParameters;
/** 请求超时时间 默认20秒 */
@property (nonatomic, assign) NSTimeInterval timeoutInterval;
/** 处理数据的 block(异步进行)*/
@property (nonatomic, copy) XTApiRequestHandleDataBlock handleDataBlock;
/** 请求数据格式 */
@property (nonatomic, assign) XTApiRequestSerializer requestSerializer;
/** 响应数据格式 */
@property (nonatomic, assign) XTApiResponseSerializer responseSerializer;
/** 是否需要继续保持对象,当存在异步上传图片 */
@property (nonatomic,assign) BOOL needRetainWhenAsyncUploadFile;
2、以下的方法都是发起网络请求。
/**
发起请求
@param method 请求方式
@param urlString 请求地址
@param parameters 请求参数
@param resultBlock 结果回调
@return 请求对象
*/
- (NSURLSessionTask *)requestBy:(XTApiRequestMethod)method urlString:(nullable NSString *)urlString parameters:(id)parameters result:(XTApiRequestResultBlock)resultBlock;
/**
上传文件
@param urlString 请求地址
@param parameters 请求参数
@param serverName 文件对应服务器上的字段
@param filePaths 文件本地的沙盒路径
@param progress 上传进度信息
@param resultBlock 结果回调
@return 请求对象
*/
- (NSURLSessionTask *)uploadFileWithURL:(NSString *)urlString parameters:(id)parameters serverName:(NSString *)serverName filePath:(NSArray *)filePaths progress:(XTApiRequestProgress)progress result:(XTApiRequestResultBlock)resultBlock;
/**
下载文件
@param urlString 请求地址
@param fileDir 文件存储目录(默认存储目录为Download)
@param progress 文件下载的进度信息
@param resultBlock 结果回调
@return 请求对象
*/
- (NSURLSessionTask *)downloadWithURL:(NSString *)urlString fileDir:(NSString *)fileDir progress:(XTApiRequestProgress)progress result:(XTApiRequestResultBlock)resultBlock;
3、每个公司的后台对数据处理都是不一样的,XTNetworking
默认是使用下面格式进行数据处理的
{
"status": {
"code": 10086,
"message": "错误信息",
},
"data": {
"dataList": [
{
"userId": "1",
"authInfo": {
"authToken": "xxx"
}
}
],
"pageInfo": {
"currentPage": 1,
"isEndPage": YES,
"totalPage": 1
}
}
}
4、如果你想数据的处理方式可以重写下面的方法
/**
校验接口返回数据格式中是返回成功标志 (可选)
*/
- (BOOL)checkResultValid:(id)resultDic;
/**
获取错误信息(可选)
@param resultDic 返回结果
*/
- (NSDictionary *)getErrorInfoWithRespose:(id)resultDic;
5、有些接口的需要单独添加参数到头部或Body里面,需要调用以下方法:
/**
设置参数到 HTTP header field
*/
- (void)setValue:(nullable NSString *)value forHTTPHeaderField:(NSString *)field;
/**
设置参数到 HTTP header field
@param parameters 参数字典,必须是 {field:value} 的样式
*/
- (void)setParametersForHTTPHeaderField:(NSDictionary *)parameters;
/**
添加参数到 Body
*/
- (void)setRequestBodyData:(NSMutableURLRequest *)request withParameters:(NSDictionary *)parameters;
处理请求的缓存结果,这个是配套YYCache
使用的具体的细节,可以查看代码
主要网络请求一些工具方法。主要是检测网络状态、添加通用参数、生成sign
签名等。
1、检测网络状态:
/**
有网:YES,无网:NO
*/
+ (BOOL)hasNetwork;
/**
wifi 网络返回 YES
*/
+ (BOOL)isWiFiNetwork;
/**
手机移动网络
*/
+ (BOOL)isWWANNetwork;
/**
实时获取网络状态,通过Block回调实时获取(此方法可多次调用)
*/
+ (void)getNetworkStatusWithBlock:(XTNetworkStatus)networkStatus;
2、添加通用参数:可以分为添加添加参数到Header
和添加到Body
。
/**
添加通用参数 - Header
@param parameters 接口参数
@return 通用接口参数
*/
+ (NSDictionary *)parameterForHttpHeadWithDictionary:(NSDictionary *)parameters;
/**
添加通用参数 - Body
@param parameters 接口参数
@return 通用接口参数
*/
+ (NSDictionary *)parameterForHttpBodyWithDictionary:(NSDictionary *)parameters;
3、生成sign签名:
/**
获取 sign 签名
@param parameters 参数
@param skey skey
@return sign签名
*/
+ (NSString *)getRequestSignWithDictionary:(NSDictionary *)parameters skey:(NSString *)skey;
/**
获取带 sign 签名的最终参数
@param parameters 接口参数
@param skey skey
@return 最终的参数
*/
+ (NSDictionary *)getFinalParametersWithSignByDictionary:(NSDictionary *)parameters skey:(NSString *)skey;
当然,不管是添加通用的参数还是生成签名都需要自己去添加。框架里面只给了方法,并有去实现。
有点是要特别注意的,就是需要先上传图片,拿到结果在拼接到其他的参数里面去。需要这样做处理
self.needRetainWhenAsyncUploadFile = YES;
__weak XTTestRequst *weakSelf = self;
// 处理数据,这里可以把请求到数据,转换成我们需要的Model
[self setHandleDataBlock:^id(id responseObject) {
if (weakSelf.needRetainWhenAsyncUploadFile) {
weakSelf.needRetainWhenAsyncUploadFile = NO;
}
return nil;
}];
// 发起请求
[self requestBy:XTApiRequestMethodGET urlString:@"" parameters:@{} result:^(BOOL success, id responseObject, NSDictionary *status) {
if (resultBlock) {
resultBlock(success, responseObject, status);
}
}];
关键是needRetainWhenAsyncUploadFile
属性。设置成YES
的时候会保持当前请求。当然如果不需要异步上传,直接调用上传图片的请求方式就好了。
首先是为了清晰的分类,配置、请求处理、通用的处理方法,这样的可以很容易阅读。其次,那就是我个人的编程习惯。
刚开始设计这个库的时候,我是想尝试一下全部统一起来。但后面发现,这样做起来偏离了我本来的目标。
主要是一直以来,我都习惯把请求单独抽离出来,划分成2层。最外层是具体业务的网络请求,里面是封装好的请求方式,以及结果处理。这样我可以在最外层的业务请求里面去配置网络请求的参数等其他的。最里面层的只负责做网络请求和数据传输。
所以,最后我只在XTNetworking
里面暴露了请求的设置以及数据处理的方式。
这个框架目前不支持cocoapods
和carthage
。主要是最近没时间去做成这个。后面的话,看心情吧。所以你只能手动添加了
找到项目中XTNetworkKit
文件夹,然后复制到你的项目中就可以了。怎么样,简单方便吧。但有一点要注意,如果你的项目中如果已经存在了AFNetworking
和YYCache
文件,那么,你需要移除一个。
好了,如果您在使用过程中遇到什么问题,可以随时提Issue
或者发送问题到邮箱 [email protected]
如果您觉得还不错,麻烦您给我个Star,非常感谢!