iOS网络层组件,支持POST/GET/PUT/DELETE等网络请求和上传下载及断点续传功能,自带网络缓存处理机制、灵活设置接口签名、自定义HEADER和公共参数等功能
pod 'EFNetworking'
EFNetHelper
:网络请求管理类
EFNRequest
:封装URL请求相关请求参数EFNResponse
:封装URL请求的相关响应数据EFNCacheHelper
:网络层缓存管理器EFNetProxy
:网络请求处理类(代理网关)
NSString+EFNetworking
NSArray+EFNetworking
NSDictionary+EFNetworking
EFNHeader
:相关的公共宏、协议和枚举在这里定义EFNGeneralConfigDelegate
EFNSignService
EFNRequestModelReformer
EFNResponseDataReformer
-
- 3.0版本及以上 - 网络请求等操作依赖此库 - 如果项目中的基础网络库不是`AFNetworking`,可以通过重写`EFNetProxy`类中的相关方法实现 - 重写`EFNetProxy`类时,需要重新定义宏 `#define _EFN_USE_AFNETWORKING_ 0`,其中 0代表不使用AFNetworking,1代表使用AFNetworking
-
- 1.0版本及以上 - 网络层缓存处理依赖此库
全局配置
// 这里设置的config实际上是一个单例,默认对EFNetHelper的实例化对象都会有效,除非单独给对应的EFNetHelper实例赋值新的config代理
[EFNetHelper generalConfigHandler:^(id<EFNGeneralConfigDelegate> _Nonnull config) {
// 设置全局签名代理
config.signService = [[DemoSignService alloc] init];
// 设置全局服务地址
config.generalServer = @"http://api.abc.com";
// 设置全局Headers
config.generalHeaders = @{@"HeaderKey":@"HeaderValue"};
// 设置通用参数
config.generalParameters = @{@"generalParameterKey":@"generalParameterValue"};
// 设置全局支持请求的数据类型
config.generalRequestSerializerType = EFNRequestSerializerTypeJSON;
// 设置全局支持响应的数据类型
config.generalResponseSerializerType = EFNResponseSerializerTypeJSON;
// 这里设置的下载文件保存路径是对全局有效的,所以建议设置的路径是指定到文件夹而不是文件,否则后下载的文件会将之前下载的文件进行覆盖
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = paths.firstObject;
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"/General/Download"];
config.generalDownloadSavePath = path;
}];
普通GET/POST/PUT/DELETE等请求
[EFNetHelper.shareHelper request:^(EFNRequest * _Nonnull request) {
// 此处若不设置request.server,会自动取全局配置里的generalServer
// 若设置了 request.server,则以request.server的值为准
// request.server = @"http://api2.abc.com";
request.api = @"testapi";
// 默认的HTTPMethod是POST,如果不是POST,在这里需要做下设置,
request.HTTPMethod = EFNHTTPMethodGET;
// 设置请求参数,请求参数可以是字典,也可以是数组,根据API实际规则做设置即可
request.parameters = @{@"key1":@"value2"};
// 设置是否允许缓存数据
request.enableCache = YES;
// 设置缓存时间,默认为 1800 秒
request.cacheTimeout = 60*60*60;
} success:^(EFNResponse * _Nullable response) {
NSLog(@"%@", response);
} failure:^(EFNResponse * _Nullable response) {
NSLog(@"%@", response);
}];
使用模型请求示例
// 实例化请求模型
DemoRequestModel *req = [[DemoRequestModel alloc] init];
req.api = @"helloworld";
req.key1 = @"value1";
req.key2 = @"value2";
req.keyn = @"valuen";
NSLog(@"req:%@", req);
[EFNetHelper.shareHelper request:req
reformer:^id<EFNResponseDataReformer> _Nullable{
DemoResponseModel *resModel = [[DemoResponseModel alloc] init];
return resModel;
}
progress:^(NSProgress * _Nonnull progress) {
NSLog(@"progress:%@",progress.localizedDescription);
}
response:^(DemoResponseModel * reformData, EFNResponse * _Nonnull response) {
if (reformData.isSuccess) {
NSLog(@"请求成功,reformData:%@", reformData);
}else{
NSLog(@"请求失败,error:%@", response.error.localizedDescription);
}
}];
上传文件示例
[EFNetHelper.shareHelper request:^(EFNRequest * _Nonnull request) {
request.api = @"file/upload";
request.parameters = @{@"path":@"EFNetWorking/demo"};
request.requestType = EFNRequestTypeFormDataUpload;
UIImage *image = [UIImage imageNamed:@"image1.png"];
NSData *imgData = UIImagePNGRepresentation(image);
[request appendUploadDataWithFileData:imgData name:@"img1"];
}
progress:^(NSProgress * _Nonnull progress) {
NSLog(@"progress:%@",progress.localizedDescription);
}
success:^(EFNResponse * _Nonnull response) {
NSLog(@"response:%@",response.description);
}
failure:^(EFNResponse * _Nonnull response) {
NSLog(@"response:%@",response.description);
}];
下载文件示例
[EFNetHelper.shareHelper request:^(EFNRequest * _Nonnull request) {
// 这里如果直接设置了url,url的格式必须是带http://或https://的url全路径,如:http://www.abc.com
// 直接设置url后,server和api将失效,也就是url的优先级是高于 server+api方式的
request.url = @"https://github.com/DandreYang/EFNetworking/archive/master.zip";
// 默认的requestType = EFNRequestTypeGeneral,如果是下载和上传请求,这里需要做下设置,否则可能会报错
request.requestType = EFNRequestTypeDownload;
// 设置是否支持断点续传,默认为支持
request.enableResumeDownload = YES;
// 设置下载文件的保存路径,针对单一下载请求,可以指定到一个明确的下载路径
// 如果这里没有做设置,会取全局配置的generalDownloadSavePath(文件夹),
// 如果全局配置也没有设置generalDownloadSavePath,则会默认保存在APP的"Documents/EFNetworking/Download/"目录下
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = paths.firstObject;
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"/Demo/Download"];
request.downloadSavePath = path;
}
progress:^(NSProgress * _Nonnull progress) {
// 需要注意的是,网络层内部已经做了处理,这里已经是在主线程了
float unitCount = 1.0 * progress.completedUnitCount/progress.totalUnitCount;
NSLog(@"%@",[NSString stringWithFormat:@"已下载 %.0f%%",unitCount*100]);
}
success:^(EFNResponse * _Nonnull response) {
NSLog(@"response:%@",response.description);
}
failure:^(EFNResponse * _Nonnull response) {
NSLog(@"response:%@",response.description);
}];
全局配置
// 这里设置的config实际上是一个单例,默认对EFNetHelper的实例化对象都会有效,除非单独给对应的EFNetHelper实例赋值新的config代理
EFNetHelper.generalConfigHandler({ (config) in
// 设置全局签名代理
config.signService = DemoSignService.init()
// 设置全局服务地址
config.generalServer = "http://api.baidu.com"
// 设置全局Headers
config.generalHeaders = ["HeaderKey":"HeaderValue"]
// 设置通用参数
config.generalParameters = ["generalParameterKey":"generalParameterValue"]
// 设置全局支持请求的数据类型
config.generalRequestSerializerType = .JSON
// 设置全局支持响应的数据类型
config.generalResponseSerializerType = .JSON
// 这里设置的下载文件保存路径是对全局有效的,所以建议设置的路径是指定到文件夹而不是文件,否则后下载的文件会将之前下载的文件进行覆盖
let documentDiretory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
config.generalDownloadSavePath = documentDiretory?.appending("/General/Download")
})
普通GET/POST/PUT/DELETE等请求
EFNetHelper.share().request({ (request) in
// 此处若不设置request.server,会自动取全局配置里的generalServer
// 若设置了 request.server,则以request.server的值为准
// request.server = @"http://api2.abc.com";
request.api = "testApi"
// 默认的HTTPMethod是.POST,如果不是POST,在这里需要做下设置,
request.httpMethod = .GET
// 设置请求参数,请求参数可以是字典,也可以是数组,根据API实际规则做设置即可
request.parameters = ["key1":"value1"] as NSObjectProtocol
// 设置是否允许缓存数据
request.enableCache = true
// 设置缓存时间,默认为 1800 秒
request.cacheTimeout = 60*60*60
}, progress: { (progress) in
print(progress.localizedDescription as Any)
}, success: { (response) in
print(response)
}) { (response) in
print(response)
}
使用模型请求示例
// 实例化请求模型
DemoRequestModel *req = DemoRequestModel.init()
req.api = "helloworld"
req.key1 = "value1"
req.key2 = "value2"
req.keyn = "valuen"
EFNetHelper.share().request(req, reformer: { () -> EFNResponseDataReformer? in
var resReformer = DemoResponseModel.init()
return resReformer
}, progress: { (progress) in
print(progress?.localizedDescription as Any)
}) { ( data, response) in
let reformData = data as! EFNResponseDataReformer
if reformData.isSuccess {
print("请求成功,reformData:\(reformData)");
} else {
print("请求失败,error:\(response.error.localizedDescription)");
}
}
上传文件示例
EFNetHelper.share().request({ (request) in
request.api = "file/upload"
request.parameters = ["path":"EFNetWorking/demo"] as NSObjectProtocol
request.requestType = .formDataUpload
if let imgData = UIImage(named: "image1.png")!.pngData() {
request.appendUploadData(withFileData: imgData, name: "img1")
} else {
print("imgData is nil")
}
}, progress: { (progress) in
print(progress.localizedDescription as Any)
}, success: { (response) in
print(response)
}) { (response) in
print(response)
}
下载文件示例
EFNetHelper.share().request({ (request) in
// 这里如果直接设置了url,url的格式必须是带http://或https://的url全路径,如:http://www.abc.com
// 直接设置url后,server和api将失效,也就是url的优先级是高于 server+api方式的
request.url = "https://github.com/DandreYang/EFNetworking/archive/master.zip"
// 默认的requestType = .General,如果是下载和上传请求,这里需要做下设置,否则可能会报错
request.requestType = .download;
// 设置是否支持断点续传,默认为支持
request.enableResumeDownload = true
// 设置下载文件的保存路径,针对单一下载请求,可以指定到一个明确的下载路径
// 如果这里没有做设置,会取全局配置的generalDownloadSavePath(文件夹),
// 如果全局配置也没有设置generalDownloadSavePath,则会默认保存在APP的"Documents/EFNetworking/Download/"目录下
let paths = NSSearchPathForDirectoriesInDomains(.downloadsDirectory, .userDomainMask, true)
let documentsDirectory = paths.first
let path = documentsDirectory?.appending("/Demo/Download")
request.downloadSavePath = path
}, progress: { (progress) in
// 需要注意的是,网络层内部已经做了处理,这里已经是在主线程了
print(progress.localizedDescription as Any);
}, success: { (response) in
print(response)
}) { (response) in
print(response)
}
EFNetworking is released under the MIT license. See LICENSE for details.