导语
在上家公司,网络请求一直是AFNetworking2.0,现在该升级了!话不多说,直接开始咱们自己的WebRequest啦!
结构
延续了2.0的习惯,这次封装这采用了简单的二次封装WebRequestManager (负责缓存)
和WebRequestSession(负责请求)
,分别进行了GET、POST、Upload(2.0分开写,3.0合并了)、Download
WebRequestSession
-
AFHTTPSessionManager懒加载
- (AFHTTPSessionManager *)requestManager { if (_requestManager == nil) { _requestManager = [[AFHTTPSessionManager alloc] initWithBaseURL:BaseUrl]; _requestManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain" ,@"application/json", @"text/json", @"text/javascript",@"text/html",@"image/png",@"image/jpeg",@"application/rtf",@"image/gif",@"application/zip",@"audio/x-wav",@"image/tiff",@" application/x-shockwave-flash",@"application/vnd.ms-powerpoint",@"video/mpeg",@"video/quicktime",@"application/x-javascript",@"application/x-gzip",@"application/x-gtar",@"application/msword",@"text/css",@"video/x-msvideo",@"text/xml", nil]; switch ([WebRequestManager sharedWebRequestManager].requestSerializerType) { case RequestSerializerTypeForm: _requestManager.requestSerializer = [AFHTTPRequestSerializer serializer]; break; case RequestSerializerTypeJSON: _requestManager.requestSerializer = [AFJSONRequestSerializer serializer]; break; default: _requestManager.requestSerializer = [AFHTTPRequestSerializer serializer]; break; } switch ([WebRequestManager sharedWebRequestManager].responseSerializerType) { case ResponseSerializerTypeHTTP: _requestManager.responseSerializer = [AFHTTPResponseSerializer serializer]; break; case ResponseSerializerTypeJSON: _requestManager.responseSerializer = [AFJSONResponseSerializer serializer]; break; default: _requestManager.responseSerializer = [AFJSONResponseSerializer serializer]; break; } _requestManager.requestSerializer.timeoutInterval = 30.f; } return _requestManager; }
-
GET请求
- (void) getDataWithURLString:(NSString *)URLString
WithParams:(id)params
success:(void(^)(id dic))success
failure:(void(^)(NSError *error))failure {[self.requestManager GET:URLString parameters:params progress:^(NSProgress * _Nonnull downloadProgress) { NSLog(@"%f",downloadProgress.fractionCompleted); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (success) { success(responseObject); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failure) { failure(error); } }]; }
-
POST请求
- (void) postDataWithURLString:(NSString *)URLString
WithParams:(id)params
success:(void(^)(id dic))success
failure:(void(^)(NSError *error))failure {[self.requestManager POST:URLString parameters:params progress:^(NSProgress * _Nonnull uploadProgress) { NSLog(@"%f",uploadProgress.fractionCompleted); } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (success) { success(responseObject); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failure) { failure(error); } }]; }
-
Upload请求
- (void) uploadFileWithURLString:(NSString *)URLString
WithParams:(id)params
data:(NSData *)data
name:(NSString *)name
fileName:(NSString *)fileName
success:(void(^)(id dic))success
failure:(void(^)(NSError *error))failure
fractionCompleted:(void(^)(double count))fractionCompleted {[self.requestManager POST:URLString parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { [formData appendPartWithFileData:data name:name fileName:fileName mimeType:@"application/octet-stream"]; } progress:^(NSProgress * _Nonnull uploadProgress) { if (fractionCompleted) { fractionCompleted(uploadProgress.fractionCompleted); } } success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (success) { success(responseObject); } } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if (failure) { failure(error); } }]; }
-
DownLoad请求
- (void) downloadFileWithURLString:(NSString *)URLString
fileDownPath:(NSString *)fileDownPath
success:(void(^)(id dic))success
failure:(void(^)(NSError *error))failure
fractionCompleted:(void(^)(double count))fractionCompleted {NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:URLString]]; NSURLSessionDownloadTask *downloadTask = [self.requestManager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) { if (fractionCompleted) { fractionCompleted(downloadProgress.fractionCompleted); } } destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) { NSURL *documentsDirectoryURL = [NSURL fileURLWithPath:fileDownPath]; NSLog(@"%@",documentsDirectoryURL); return documentsDirectoryURL; } completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) { if (!error) { if (success) { success(filePath); } }else { if (failure) { failure(error); } } }]; [downloadTask resume]; }
-
取消请求
- (void)cancelRequest {[self.requestManager.operationQueue cancelAllOperations]; }
WebRequestManager
这里面GET和POST需缓存,这里以GET为例,详细看demo
-
初始化操作缓存池
// 初始化操作缓存池
- (NSMutableDictionary *)operationCachePool {if (_operationCachePool == nil) { _operationCachePool = [[NSMutableDictionary alloc] init]; } return _operationCachePool; }
-
GET请求
- (void) getDataWithURLString:(NSString *)URLString
WithParams:(id)params
success:(void(^)(id dic))success
failure:(void(^)(NSError *error))failure {URLString = [self beforeRequestWithSettingWithURLString:URLString]; WebRequestSession *requestSession = [[WebRequestSession alloc]init]; [self.operationCachePool setObject:requestSession forKey:URLString]; self.webRequestSession = requestSession; [requestSession getDataWithURLString:URLString WithParams:params success:^(id dic) { [self setReturnSuccessWithSuccess:success URLString:URLString returnData:dic]; } failure:^(NSError *error) { [self BlockWith:error success:success failure:failure]; }]; }
// 请求数据成功,返回数据
- (void) setReturnSuccessWithSuccess:(void(^)(id dic))success URLString:(NSString *)URLString returnData:(id)dic {
if ([self.operationCachePool objectForKey:self.webTask]) {
[self.operationCachePool removeObjectForKey:self.webTask];
}
NSString *hash = [self.webTask md5String];
NSString *filePath = [self pathForDocumentWithComponent:hash];
NSData *data = [[Transformer sharedTransformer] returnDataWithDictionary:dic];
[data writeToFile:filePath atomically:YES];
if (success) {
success(dic);
}
[self.operationCachePool removeObjectForKey:URLString];
}
// 请求数据失败,有缓存取缓存,没缓存返回error
- (void)BlockWith:(NSError*)error success:(void(^)(id dic))success failure:(void(^)(NSError *error))failure {
if (self.isCanceled) {
self.isCanceled = NO;
if (failure) {
failure(error);
}
}else{
NSLog(@"%@",self.webTask);
NSString *hash = [self.webTask md5String];
NSString *filePath = [self pathForDocumentWithComponent:hash];
NSLog(@"%@",filePath);
NSDictionary *dic = [[Transformer sharedTransformer] returnDictionaryWithDataPath:filePath];
if(dic){
NSLog(@"%@",dic);
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
if (success) {
success(dic);
}
NSLog(@"网络不畅,缓存中取~~~~~~~~");
}
}else {
NSLog(@"%@~~~",dic);
if (failure) {
failure(error);
}
}
}
}
// 获取沙盒路径
- (NSString *)pathForDocumentWithComponent:(NSString *)fid {
NSString *fullPath = nil;
if (fid&& [fid length]) {
NSString *path = NSHomeDirectory();
NSString *cacheDiretory= [path stringByAppendingPathComponent:@"Library/Caches/"];
cacheDiretory = [cacheDiretory stringByAppendingPathComponent:@"webCache"];
fullPath = [cacheDiretory stringByAppendingPathComponent:fid];
} else {
fullPath = kWebCachePath;
}
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:fullPath]) {
NSError *err=nil;
if ([fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:nil error:&err]) {
return [fullPath stringByAppendingPathComponent:fid];
}else{
[fileManager createDirectoryAtPath:fullPath withIntermediateDirectories:YES attributes:nil error:&err];
return [fullPath stringByAppendingPathComponent:fid];
}
}
fullPath = [fullPath stringByAppendingPathComponent:fid];
return fullPath;
}
// 获取当前时间
- (NSString*)getDate {
NSDate* now = [NSDate date];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
NSLog(@"%@",[dateFormatter stringFromDate:now]);
return [dateFormatter stringFromDate:now];
}
效果图
效果图.gif结束语
新公司注重开源,以后我自己研发的,或者整理的,只要是好东西,我一般都会分享到这的!
网友评论