在开发项目中避免第三方框架对项目的侵入性,很多需要对第三方框架进行封装,方便以后的框架的变动,项目的管理.下面就自己来说一说自己在项目中,怎么封装的AFN框架.
第一步,提供接口供外界调用,传入参数,block返回请求到的数据,提供了四个接口方法,post请求,get请求,图片post请求
typedef void (^DownloadFinishedBlock)(NSData *requestData,NSDictionary *requestDict,NSError *error);
@interface HttpRequest : NSObject
/**
* post请求
*
* @param urlString 网址
* @param dict 字典
* @param finsihedBlock 返回数据
* @param isCache 是否缓存
*/
-(void)PostWithUrlString:(NSString *)urlString parms:(NSDictionary *)dict finished:(DownloadFinishedBlock)finsihedBlock isCache:(BOOL)isCache;
- (void)PostWithUrlString:(NSString *)urlString isBoody:(BOOL)need parms:(NSDictionary *)dict finished:(DownloadFinishedBlock)finishedBlock isCache:(BOOL)isCache;
/**
* Get请求
*
* @param urlString 网址
* @param dict 字典
* @param finishedBlock 返回数据
* @param isCach 是否缓存
*/
- (void)GetWithUrlString:(NSString *)urlString parms:(NSDictionary *)dict finished:(DownloadFinishedBlock)finishedBlock isCache:(BOOL)isCach;
/**
* 上传image
*
* @param urlString 网址
* @param dict 其他普通数据的字典
* @param images images的数组
* @param finishdeBlock 返回结果
*/
-(void)PostDataWithUrlString:(NSString *)urlString parm
在方法中判断是否需要缓存到本地,缓存到本地的数据是不是超时,所以在接下来实现缓存工具类
第二步,写一个缓存工具类(Cache类),实现本地的缓存,判断缓存是否超时,重新请求.
在工具类中提供给外部接口方法,传入参数,block返回是否写入,或者是否取得本地缓存数据
typedef void (^isCleanCacheSuccess) (BOOL success);
typedef void (^isGetCacheSuccess) (BOOL success,id requestObjc);
@interface Cache : NSObject
@property (nonatomic,strong) NSString *homePath;
+(Cache *)cache;
-(void)writeFile:(id)object toPath:(NSString *)path;
-(void)getFileWithPath:(NSString *)path isSuccess:(isGetCacheSuccess)success;
-(NSString *)getPath:(NSString *)path;
/**判断缓存是否存在是否超时,正常情况下返回yes说明需要重新请求数据*/
-(BOOL)cacheIsExistAndIsNoOutTimeWithPath:(NSString *)path time:(NSTimeInterval)time;
/**清理所有缓存*/
-(void)cleanCacheWithSuccess:(isCleanCacheSuccess)success;
/**计算path文件下文件的总大小*/
-(double)fileSizeForDir:(NSString *)path;
/**计算所有的缓存文件的大小*/
-(double)allFileSizeWithCache;
/**缓存的目录*/
-(NSString *)getCachesPath;
-(void)cleanCacheWithPathStr:(NSString *)path;
在这个工具类中,对于需要加密的数据,需要加密,所以引入了MD5进行加密处理.然后又使用了NSFileManager的分类来计算缓存文件的大小,是否超时等
下面来说下AFN主要代码实现:
post请求:
AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://test.cn/"]];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.allowInvalidCertificates = YES;
sessionManager.securityPolicy = securityPolicy;
sessionManager.responseSerializer = [AFHTTPResponseSerializer serializer];
sessionManager.requestSerializer.timeoutInterval = 10*4;
sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",@"text/json",@"text/plain",@"text/html", nil];
[sessionManager.requestSerializer setValue:ProtocolVerNO forKey:ProtocolVer];
//储存用户信息
NSString *userId = restoreValueForKey(UserId);//从本地取出userid
if (userId) {
[sessionManager.requestSerializer setValue:userId forHTTPHeaderField:UserId];
}
NSString *ptToken = restoreValueForKey(PtToken);
if (ptToken) {
[sessionManager.requestSerializer setValue:ptToken forHTTPHeaderField:PtToken];
}
//
[sessionManager POST:urlString parameters:dict isBody:need success:^(NSURLSessionDataTask *task, id responseObject) {
if ([responseObject isKindOfClass:[NSDictionary class]]) {
finishedBlock(responseObject,responseObject,nil);
}else{//不是字典
NSError *error = nil;
NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error];
finishedBlock(responseObject,dataDict,nil);
}
//需要储存数据,就存到本地
if (isCache) {
NSString *path = [self appendCacheUrlStringPath:urlString WithDict:dict];
[[Cache cache] writeFile:responseObject toPath:path];
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
finishedBlock(nil,nil,error);
application.networkActivityIndicatorVisible = NO;
}];
get请求:
AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://test.rest.parteam.cn/"]];
manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
manager.requestSerializer.timeoutInterval = 60*4;
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy = securityPolicy;
[manager GET:urlString parameters:dict success:^(NSURLSessionDataTask *task, id responseObject) {
NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
finishedBlock(responseObject,dataDict,nil);
if (isCach) {
NSString *path = [self appendCacheUrlStringPath:urlString WithDict:dict];
[[Cache cache] writeFile:responseObject toPath:path];
}
} failure:^(NSURLSessionDataTask *task, NSError *error) {
finishedBlock(nil,nil,error);
}];
图片上传post请求:
[manager POST:urlString parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
if (images.count != 0) {
for (NSInteger i = 0; i<images.count; i++) {
NSData *imageData = images[i];
[formData appendPartWithFileData:imageData name:[NSString stringWithFormat:@"file%ld",i] fileName:[NSString stringWithFormat:@"image%ld.%@",i,returnImagesType([images objectAtIndex:i])] mimeType:[NSString stringWithFormat:@"file/%@",returnImagesType([images objectAtIndex:i])]];
}
}
} success:^(NSURLSessionDataTask *task, id responseObject) {
NSDictionary *dataDict = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
finishdeBlock(responseObject,dataDict,nil);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
finishdeBlock(nil,nil,error);
}];
欢迎大家查看源码: https://github.com/anywhereIOS/AFN-.git