AFNetworking封装
来源:互联网 发布:游戏编程的软件 编辑:程序博客网 时间:2024/06/05 07:15
.h里面
//
// CJNetworkRequest.m
//
//
// Created by YouChangJiang on 16/4/19.
// Copyright © 2016年 YouChangJiang. All rights reserved.
//
/*
* CJNetworkApi的一些功能和说明:
1. 使用CJNetworkRequest做一些GET、POST、PUT、DELETE请求,与业务逻辑对接部分直接以数组或者字典的形式返回。
2. 网络下载、上传文件,以block的形式返回实时的下载、上传进度,上传文件参数通过模型CJFileConfig去存取。
3. 通过继承于CJDataService来将一些数据处理,模型转化封装起来,于业务逻辑对接返回的是对应的模型,减少Controllor处理数据处理逻辑的压力。
4. 自定义一些回调的block
*/
#import "CJNetworkRequest.h"
static BOOL isNetworkUse;
static NSMutableDictionary *dictionaryForConnectionTag;
@implementation CJNetworkRequest
+(void)initialize {
dictionaryForConnectionTag = [[NSMutableDictionaryalloc]initWithCapacity:20];
}
+(NSString *) paramAES128String:(NSDictionary *) param {
NSMutableDictionary *muParam = [NSMutableDictionarydictionaryWithDictionary:param];
[muParam setObject:[NSStringstringWithFormat:@"%ld",(long)[[NSDatedate] timeIntervalSince1970]]forKey:@"requesttime"];
NSDictionary *localDic =[[NSBundlemainBundle] infoDictionary];
NSString *currentVersion = [localDicobjectForKey:@"CFBundleShortVersionString"];
[muParam setObject:currentVersionforKey:@"version"];
NSString *jsonString =nil;
NSError *error;
NSData *jsonData = [NSJSONSerializationdataWithJSONObject:muParam
options:NSJSONWritingPrettyPrinted// Pass 0 if you don't care about the readability of the generated string
error:&error];
if (!jsonData) {
NSLog(@"Got an error: %@", error);
} else {
jsonString = [[NSStringalloc] initWithData:jsonDataencoding:NSUTF8StringEncoding];
}
return jsonString;
}
+ (void)getRequest:(NSString *)url params:(NSDictionary *)params isEncryption:(BOOL) flag success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {
NSString *absoluteURL = [selfgenerateGETAbsoluteURL:urlparams:params];
NSString *key = [MyShareClassycjnetworking_md5:absoluteURL];
NSLog(@"%@",key);
if (![selfverifyReuqest:key]) {
return;
}
AFHTTPSessionManager *manager = [selfgetRequstManager];
NSDictionary *paramAESDic = flag?@{@"guess":[DES3UtilAES128Encrypt:[selfparamAES128String:params]]}:params;
[manager GET:urlparameters:paramAESDic progress:^(NSProgress *_Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
[dictionaryForConnectionTagremoveObjectForKey:key];
successHandler(responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
CJLog(@"------请求失败-------%@",error);
[((JMBaseVC *)[MyShareClassgetInstance].mainViewController)hideLoading];
if (error.code == -1009) {
[DialogtoastCenter:error.localizedDescription];
} else {
[[DialogInstance] hideProgress];
}
[dictionaryForConnectionTagremoveObjectForKey:key];
failureHandler(error);
}];
}
+ (void)postRequest:(NSString *)url params:(NSDictionary *)params isEncryption:(BOOL) flag success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {
NSString *absoluteURL = [selfgenerateGETAbsoluteURL:urlparams:params];
NSString *key = [MyShareClassycjnetworking_md5:absoluteURL];
if (![selfverifyReuqest:key]) {
return;
}
AFHTTPSessionManager *manager = [selfgetRequstManager];
NSDictionary *paramAESDic = flag?@{@"guess":[DES3UtilAES128Encrypt:[selfparamAES128String:params]]}:params;
[manager POST:urlparameters:paramAESDic progress:^(NSProgress *_Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
[dictionaryForConnectionTagremoveObjectForKey:key];
successHandler(responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
CJLog(@"------请求失败-------%@",error);
[((JMBaseVC *)[MyShareClassgetInstance].mainViewController)hideLoading];
if (error.code == -1009) {
[DialogtoastCenter:error.localizedDescription];
} else {
[[DialogInstance] hideProgress];
}
[dictionaryForConnectionTagremoveObjectForKey:key];
failureHandler(error);
}];
}
+ (void)putRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {
AFHTTPSessionManager *manager = [selfgetRequstManager];
[manager PUT:urlparameters:params success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
successHandler(responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
CJLog(@"------请求失败-------%@",error);
failureHandler(error);
}];
}
+ (void)deleteRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {
AFHTTPSessionManager *manager = [selfgetRequstManager];
[manager DELETE:urlparameters:params success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
successHandler(responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
CJLog(@"------请求失败-------%@",error);
if (error.code == -1009) {
[DialogtoastCenter:error.localizedDescription];
[((JMBaseVC *)[MyShareClassgetInstance].mainViewController).refreshTB.mj_headerendRefreshing];
}
failureHandler(error);
}];
}
/**
下载文件,监听下载进度
*/
+ (void)downloadRequest:(NSString *)url successAndProgress:(progressBlock)progressHandler complete:(responseBlock)completionHandler {
if (![selfcheckNetworkStatus]) {
progressHandler(0,0, 0);
completionHandler(nil,nil);
return;
}
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfigurationdefaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManageralloc] initWithSessionConfiguration:sessionConfiguration];
NSURLRequest *request = [NSURLRequestrequestWithURL:[NSURLURLWithString:url]];
NSURLSessionDownloadTask *downloadTask = [managerdownloadTaskWithRequest:requestprogress:^(NSProgress *_Nonnull downloadProgress) {
} destination:^NSURL *_Nonnull(NSURL *_Nonnull targetPath, NSURLResponse * _Nonnull response) {
NSURL *documentUrl = [[NSFileManagerdefaultManager] URLForDirectory :NSDocumentDirectoryinDomain:NSUserDomainMaskappropriateForURL:nilcreate:NOerror:nil];
return [documentUrlURLByAppendingPathComponent:[responsesuggestedFilename]];
} completionHandler:^(NSURLResponse *_Nonnull response, NSURL * _Nonnull filePath,NSError * _Nonnull error) {
if (error) {
CJLog(@"------下载失败-------%@",error);
}
completionHandler(response, error);
}];
[manager setDownloadTaskDidWriteDataBlock:^(NSURLSession *_Nonnull session, NSURLSessionDownloadTask * _Nonnull downloadTask, int64_t bytesWritten,int64_t totalBytesWritten,int64_t totalBytesExpectedToWrite) {
progressHandler(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
}];
[downloadTask resume];
}
/**
* 发送一个POST请求
* @param fileConfig 文件相关参数模型
* @param success 请求成功后的回调
* @param failure 请求失败后的回调
* 无上传进度监听
*/
+ (void)updateRequest:(NSString *)url params:(NSDictionary *)params fileConfig:(CJFileConfig *)fileConfig success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {
AFHTTPSessionManager *manager = [selfgetRequstManager];
[manager POST:urlparameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
[formData appendPartWithFileData:fileConfig.fileDataname:fileConfig.namefileName:fileConfig.fileNamemimeType:fileConfig.mimeType];
} progress:^(NSProgress *_Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
successHandler(responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
CJLog(@"------上传失败-------%@",error);
failureHandler(error);
}];
}
/**
上传文件,监听上传进度
*/
+ (void)updateRequest:(NSString *)url params:(NSDictionary *)params fileConfig:(CJFileConfig *)fileConfig successAndProgress:(progressBlock)progressHandler complete:(responseBlock)completionHandler {
//获取上传进度
AFHTTPSessionManager *manager = [selfgetRequstManager];
NSURLSessionDataTask *session = [managerPOST:url parameters:paramsconstructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// 上传图片,以文件流的格式
[formData appendPartWithFileData:fileConfig.fileDataname:fileConfig.namefileName:fileConfig.fileNamemimeType:fileConfig.mimeType];
} progress:^(NSProgress *_Nonnull uploadProgress) {
progressHandler(uploadProgress.completedUnitCount, uploadProgress.totalUnitCount, uploadProgress.totalUnitCount - uploadProgress.completedUnitCount);
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
completionHandler(responseObject, nil);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
completionHandler(nil, error);
if (error) {
CJLog(@"------上传失败-------%@",error);
}
}];
[session resume];
}
+ (AFHTTPSessionManager *)getRequstManager {
// 开启转圈圈
[AFNetworkActivityIndicatorManagersharedManager].enabled =YES;
AFHTTPSessionManager *manager =nil;
manager = [AFHTTPSessionManagermanager];
manager.responseSerializer.acceptableContentTypes =nil;//[NSSet setWithObject:@"text/ plain"];
manager.securityPolicy = [AFSecurityPolicydefaultPolicy];
manager.securityPolicy.allowInvalidCertificates =YES;// https manager.securityPolicy.validatesDomainName = NO;//
manager.requestSerializer.stringEncoding =NSUTF8StringEncoding;
manager.responseSerializer.acceptableContentTypes = [NSSetsetWithArray:@[@"application/json",
@"text/html",
@"text/json",
@"text/plain",
@"text/javascript",
@"text/xml",
@"image/*"]];
// 设置允许同时最大并发数量,过大容易出问题
manager.operationQueue.maxConcurrentOperationCount =3;
manager.requestSerializer.timeoutInterval =30;
return manager;
}
#pragma mark-Private
/**
url编码
*/
+ (NSString *)encodeUrl:(NSString *)url {
return [selfcj_URLEncode:url];
}
+ (NSString *)cj_URLEncode:(NSString *)url {
NSString *newString =
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)url,
NULL,
CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"),CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)));
if (newString) {
return newString;
}
return url;
}
/**
监控网络状态
*/
+ (BOOL)checkNetworkStatus {
AFNetworkReachabilityManager *reachabilityManager = [AFNetworkReachabilityManagersharedManager];
[reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
if (status ==AFNetworkReachabilityStatusUnknown) {
isNetworkUse =YES;
} elseif (status ==AFNetworkReachabilityStatusReachableViaWiFi){
isNetworkUse =YES;
} elseif (status ==AFNetworkReachabilityStatusReachableViaWWAN){
isNetworkUse =YES;
} elseif (status ==AFNetworkReachabilityStatusNotReachable){
// 网络异常操作
isNetworkUse =NO;
CJLog(@"网络异常,请检查网络是否可用!");
}
}];
[reachabilityManager startMonitoring];
returnisNetworkUse;
}
// 仅对一级字典结构起作用
+ (NSString *)generateGETAbsoluteURL:(NSString *)url params:(id)params {
if (params ==nil || ![params isKindOfClass:[NSDictionaryclass]] || [params count] == 0) {
return url;
}
NSString *queries =@"";
for (NSString *keyin params) {
id value = [paramsobjectForKey:key];
if ([valueisKindOfClass:[NSDictionaryclass]]) {
continue;
} elseif ([value isKindOfClass:[NSArrayclass]]) {
continue;
} elseif ([value isKindOfClass:[NSSetclass]]) {
continue;
} else {
queries = [NSStringstringWithFormat:@"%@%@=%@&",
(queries.length ==0 ? @"&" : queries),
key,
value];
}
}
if (queries.length >1) {
queries = [queries substringToIndex:queries.length -1];
}
if (([urlhasPrefix:@"http://"] || [urlhasPrefix:@"https://"]) && queries.length >1) {
if ([urlrangeOfString:@"?"].location !=NSNotFound
|| [url rangeOfString:@"#"].location !=NSNotFound) {
url = [NSStringstringWithFormat:@"%@%@", url, queries];
} else {
queries = [queries substringFromIndex:1];
url = [NSStringstringWithFormat:@"%@?%@", url, queries];
}
}
return url.length ==0 ? queries : url;
}
/**
* 该方法用于判断进入的网络连接请求是否是第一次,或者是否是重复请求(上一次请求还没结束,相同的请求又开始了)
*
* @param verifyDictionary 外部传来的参数
*
* @return 是否同意发起请求
*/
+(BOOL)verifyReuqest:(NSString*)verifyString{
/**
* 第一次请求经过数据中心类时,做一下标记,然后将请求交给AFHTTPRequestOperation。然后有返回数据,则将该标记清空。这样,在该过程中,如果有重复请求,在存在tag标记时,不会将请求交给AFHTTPRequestOperation
*/
/**
* 这个标识存在于传来的NSDictionary中,这样就可以确保每个类中每个请求传来的标识都不一样。
使用NSMutableDictionary储存该标识。key - value对应 ‘key’储存的是每个请求的标识,‘value’储存的是请求的状态。默认是NO,发起请求时改变为YES,收到返回数据的时候还原为NO。如果有重复请求进入,则判断value为YES,阻止该次请求。
*/
if ([dictionaryForConnectionTagobjectForKey:verifyString]) {
/**
* 如果NSMutableDictionary中存在该标识,则去查看对应value的状态
*/
if ([[dictionaryForConnectionTagobjectForKey:verifyString]integerValue]== NO) {
returnNO;
} else {
returnYES;
}
} else{
/**
* 如果没有该标识,则说明该请求是第一次,将其加入字典中,然后发起请求,百度统计
*/
[dictionaryForConnectionTagsetObject:[NSNumbernumberWithBool:0]forKey:verifyString];
returnYES;
}
}
@end
/**
* 用来封装上传参数
*/
@implementation CJFileConfig
+ (instancetype)fileConfigWithfileData:(NSData *)fileData name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType {
return [[selfalloc] initWithfileData:fileDataname:name fileName:fileNamemimeType:mimeType];
}
- (instancetype)initWithfileData:(NSData *)fileData name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType {
if (self = [superinit]) {
_fileData = fileData;
_name = name;
_fileName = fileName;
_mimeType = mimeType;
}
returnself;
}
@end
.m里面
//
// CJNetworkRequest.m
//
//
// Created by YouChangJiang on 16/4/19.
// Copyright © 2016年 YouChangJiang. All rights reserved.
//
/*
* CJNetworkApi的一些功能和说明:
1. 使用CJNetworkRequest做一些GET、POST、PUT、DELETE请求,与业务逻辑对接部分直接以数组或者字典的形式返回。
2. 网络下载、上传文件,以block的形式返回实时的下载、上传进度,上传文件参数通过模型CJFileConfig去存取。
3. 通过继承于CJDataService来将一些数据处理,模型转化封装起来,于业务逻辑对接返回的是对应的模型,减少Controllor处理数据处理逻辑的压力。
4. 自定义一些回调的block
*/
#import "CJNetworkRequest.h"
static BOOL isNetworkUse;
static NSMutableDictionary *dictionaryForConnectionTag;
@implementation CJNetworkRequest
+(void)initialize {
dictionaryForConnectionTag = [[NSMutableDictionaryalloc]initWithCapacity:20];
}
+(NSString *) paramAES128String:(NSDictionary *) param {
NSMutableDictionary *muParam = [NSMutableDictionarydictionaryWithDictionary:param];
[muParam setObject:[NSStringstringWithFormat:@"%ld",(long)[[NSDatedate] timeIntervalSince1970]]forKey:@"requesttime"];
NSDictionary *localDic =[[NSBundlemainBundle] infoDictionary];
NSString *currentVersion = [localDicobjectForKey:@"CFBundleShortVersionString"];
[muParam setObject:currentVersionforKey:@"version"];
NSString *jsonString =nil;
NSError *error;
NSData *jsonData = [NSJSONSerializationdataWithJSONObject:muParam
options:NSJSONWritingPrettyPrinted// Pass 0 if you don't care about the readability of the generated string
error:&error];
if (!jsonData) {
NSLog(@"Got an error: %@", error);
} else {
jsonString = [[NSStringalloc] initWithData:jsonDataencoding:NSUTF8StringEncoding];
}
return jsonString;
}
+ (void)getRequest:(NSString *)url params:(NSDictionary *)params isEncryption:(BOOL) flag success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {
NSString *absoluteURL = [selfgenerateGETAbsoluteURL:urlparams:params];
NSString *key = [MyShareClassycjnetworking_md5:absoluteURL];
NSLog(@"%@",key);
if (![selfverifyReuqest:key]) {
return;
}
AFHTTPSessionManager *manager = [selfgetRequstManager];
NSDictionary *paramAESDic = flag?@{@"guess":[DES3UtilAES128Encrypt:[selfparamAES128String:params]]}:params;
[manager GET:urlparameters:paramAESDic progress:^(NSProgress *_Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
[dictionaryForConnectionTagremoveObjectForKey:key];
successHandler(responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
CJLog(@"------请求失败-------%@",error);
[((JMBaseVC *)[MyShareClassgetInstance].mainViewController)hideLoading];
if (error.code == -1009) {
[DialogtoastCenter:error.localizedDescription];
} else {
[[DialogInstance] hideProgress];
}
[dictionaryForConnectionTagremoveObjectForKey:key];
failureHandler(error);
}];
}
+ (void)postRequest:(NSString *)url params:(NSDictionary *)params isEncryption:(BOOL) flag success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {
NSString *absoluteURL = [selfgenerateGETAbsoluteURL:urlparams:params];
NSString *key = [MyShareClassycjnetworking_md5:absoluteURL];
if (![selfverifyReuqest:key]) {
return;
}
AFHTTPSessionManager *manager = [selfgetRequstManager];
NSDictionary *paramAESDic = flag?@{@"guess":[DES3UtilAES128Encrypt:[selfparamAES128String:params]]}:params;
[manager POST:urlparameters:paramAESDic progress:^(NSProgress *_Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
[dictionaryForConnectionTagremoveObjectForKey:key];
successHandler(responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
CJLog(@"------请求失败-------%@",error);
[((JMBaseVC *)[MyShareClassgetInstance].mainViewController)hideLoading];
if (error.code == -1009) {
[DialogtoastCenter:error.localizedDescription];
} else {
[[DialogInstance] hideProgress];
}
[dictionaryForConnectionTagremoveObjectForKey:key];
failureHandler(error);
}];
}
+ (void)putRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {
AFHTTPSessionManager *manager = [selfgetRequstManager];
[manager PUT:urlparameters:params success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
successHandler(responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
CJLog(@"------请求失败-------%@",error);
failureHandler(error);
}];
}
+ (void)deleteRequest:(NSString *)url params:(NSDictionary *)params success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {
AFHTTPSessionManager *manager = [selfgetRequstManager];
[manager DELETE:urlparameters:params success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
successHandler(responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
CJLog(@"------请求失败-------%@",error);
if (error.code == -1009) {
[DialogtoastCenter:error.localizedDescription];
[((JMBaseVC *)[MyShareClassgetInstance].mainViewController).refreshTB.mj_headerendRefreshing];
}
failureHandler(error);
}];
}
/**
下载文件,监听下载进度
*/
+ (void)downloadRequest:(NSString *)url successAndProgress:(progressBlock)progressHandler complete:(responseBlock)completionHandler {
if (![selfcheckNetworkStatus]) {
progressHandler(0,0, 0);
completionHandler(nil,nil);
return;
}
NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfigurationdefaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManageralloc] initWithSessionConfiguration:sessionConfiguration];
NSURLRequest *request = [NSURLRequestrequestWithURL:[NSURLURLWithString:url]];
NSURLSessionDownloadTask *downloadTask = [managerdownloadTaskWithRequest:requestprogress:^(NSProgress *_Nonnull downloadProgress) {
} destination:^NSURL *_Nonnull(NSURL *_Nonnull targetPath, NSURLResponse * _Nonnull response) {
NSURL *documentUrl = [[NSFileManagerdefaultManager] URLForDirectory :NSDocumentDirectoryinDomain:NSUserDomainMaskappropriateForURL:nilcreate:NOerror:nil];
return [documentUrlURLByAppendingPathComponent:[responsesuggestedFilename]];
} completionHandler:^(NSURLResponse *_Nonnull response, NSURL * _Nonnull filePath,NSError * _Nonnull error) {
if (error) {
CJLog(@"------下载失败-------%@",error);
}
completionHandler(response, error);
}];
[manager setDownloadTaskDidWriteDataBlock:^(NSURLSession *_Nonnull session, NSURLSessionDownloadTask * _Nonnull downloadTask, int64_t bytesWritten,int64_t totalBytesWritten,int64_t totalBytesExpectedToWrite) {
progressHandler(bytesWritten, totalBytesWritten, totalBytesExpectedToWrite);
}];
[downloadTask resume];
}
/**
* 发送一个POST请求
* @param fileConfig 文件相关参数模型
* @param success 请求成功后的回调
* @param failure 请求失败后的回调
* 无上传进度监听
*/
+ (void)updateRequest:(NSString *)url params:(NSDictionary *)params fileConfig:(CJFileConfig *)fileConfig success:(requestSuccessBlock)successHandler failure:(requestFailureBlock)failureHandler {
AFHTTPSessionManager *manager = [selfgetRequstManager];
[manager POST:urlparameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
[formData appendPartWithFileData:fileConfig.fileDataname:fileConfig.namefileName:fileConfig.fileNamemimeType:fileConfig.mimeType];
} progress:^(NSProgress *_Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
successHandler(responseObject);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
CJLog(@"------上传失败-------%@",error);
failureHandler(error);
}];
}
/**
上传文件,监听上传进度
*/
+ (void)updateRequest:(NSString *)url params:(NSDictionary *)params fileConfig:(CJFileConfig *)fileConfig successAndProgress:(progressBlock)progressHandler complete:(responseBlock)completionHandler {
//获取上传进度
AFHTTPSessionManager *manager = [selfgetRequstManager];
NSURLSessionDataTask *session = [managerPOST:url parameters:paramsconstructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// 上传图片,以文件流的格式
[formData appendPartWithFileData:fileConfig.fileDataname:fileConfig.namefileName:fileConfig.fileNamemimeType:fileConfig.mimeType];
} progress:^(NSProgress *_Nonnull uploadProgress) {
progressHandler(uploadProgress.completedUnitCount, uploadProgress.totalUnitCount, uploadProgress.totalUnitCount - uploadProgress.completedUnitCount);
} success:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {
completionHandler(responseObject, nil);
} failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {
completionHandler(nil, error);
if (error) {
CJLog(@"------上传失败-------%@",error);
}
}];
[session resume];
}
+ (AFHTTPSessionManager *)getRequstManager {
// 开启转圈圈
[AFNetworkActivityIndicatorManagersharedManager].enabled =YES;
AFHTTPSessionManager *manager =nil;
manager = [AFHTTPSessionManagermanager];
manager.responseSerializer.acceptableContentTypes =nil;//[NSSet setWithObject:@"text/ plain"];
manager.securityPolicy = [AFSecurityPolicydefaultPolicy];
manager.securityPolicy.allowInvalidCertificates =YES;// https manager.securityPolicy.validatesDomainName = NO;//
manager.requestSerializer.stringEncoding =NSUTF8StringEncoding;
manager.responseSerializer.acceptableContentTypes = [NSSetsetWithArray:@[@"application/json",
@"text/html",
@"text/json",
@"text/plain",
@"text/javascript",
@"text/xml",
@"image/*"]];
// 设置允许同时最大并发数量,过大容易出问题
manager.operationQueue.maxConcurrentOperationCount =3;
manager.requestSerializer.timeoutInterval =30;
return manager;
}
#pragma mark-Private
/**
url编码
*/
+ (NSString *)encodeUrl:(NSString *)url {
return [selfcj_URLEncode:url];
}
+ (NSString *)cj_URLEncode:(NSString *)url {
NSString *newString =
CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
(CFStringRef)url,
NULL,
CFSTR(":/?#[]@!$ &'()*+,;=\"<>%{}|\\^~`"),CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)));
if (newString) {
return newString;
}
return url;
}
/**
监控网络状态
*/
+ (BOOL)checkNetworkStatus {
AFNetworkReachabilityManager *reachabilityManager = [AFNetworkReachabilityManagersharedManager];
[reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
if (status ==AFNetworkReachabilityStatusUnknown) {
isNetworkUse =YES;
} elseif (status ==AFNetworkReachabilityStatusReachableViaWiFi){
isNetworkUse =YES;
} elseif (status ==AFNetworkReachabilityStatusReachableViaWWAN){
isNetworkUse =YES;
} elseif (status ==AFNetworkReachabilityStatusNotReachable){
// 网络异常操作
isNetworkUse =NO;
CJLog(@"网络异常,请检查网络是否可用!");
}
}];
[reachabilityManager startMonitoring];
returnisNetworkUse;
}
// 仅对一级字典结构起作用
+ (NSString *)generateGETAbsoluteURL:(NSString *)url params:(id)params {
if (params ==nil || ![params isKindOfClass:[NSDictionaryclass]] || [params count] == 0) {
return url;
}
NSString *queries =@"";
for (NSString *keyin params) {
id value = [paramsobjectForKey:key];
if ([valueisKindOfClass:[NSDictionaryclass]]) {
continue;
} elseif ([value isKindOfClass:[NSArrayclass]]) {
continue;
} elseif ([value isKindOfClass:[NSSetclass]]) {
continue;
} else {
queries = [NSStringstringWithFormat:@"%@%@=%@&",
(queries.length ==0 ? @"&" : queries),
key,
value];
}
}
if (queries.length >1) {
queries = [queries substringToIndex:queries.length -1];
}
if (([urlhasPrefix:@"http://"] || [urlhasPrefix:@"https://"]) && queries.length >1) {
if ([urlrangeOfString:@"?"].location !=NSNotFound
|| [url rangeOfString:@"#"].location !=NSNotFound) {
url = [NSStringstringWithFormat:@"%@%@", url, queries];
} else {
queries = [queries substringFromIndex:1];
url = [NSStringstringWithFormat:@"%@?%@", url, queries];
}
}
return url.length ==0 ? queries : url;
}
/**
* 该方法用于判断进入的网络连接请求是否是第一次,或者是否是重复请求(上一次请求还没结束,相同的请求又开始了)
*
* @param verifyDictionary 外部传来的参数
*
* @return 是否同意发起请求
*/
+(BOOL)verifyReuqest:(NSString*)verifyString{
/**
* 第一次请求经过数据中心类时,做一下标记,然后将请求交给AFHTTPRequestOperation。然后有返回数据,则将该标记清空。这样,在该过程中,如果有重复请求,在存在tag标记时,不会将请求交给AFHTTPRequestOperation
*/
/**
* 这个标识存在于传来的NSDictionary中,这样就可以确保每个类中每个请求传来的标识都不一样。
使用NSMutableDictionary储存该标识。key - value对应 ‘key’储存的是每个请求的标识,‘value’储存的是请求的状态。默认是NO,发起请求时改变为YES,收到返回数据的时候还原为NO。如果有重复请求进入,则判断value为YES,阻止该次请求。
*/
if ([dictionaryForConnectionTagobjectForKey:verifyString]) {
/**
* 如果NSMutableDictionary中存在该标识,则去查看对应value的状态
*/
if ([[dictionaryForConnectionTagobjectForKey:verifyString]integerValue]== NO) {
returnNO;
} else {
returnYES;
}
} else{
/**
* 如果没有该标识,则说明该请求是第一次,将其加入字典中,然后发起请求,百度统计
*/
[dictionaryForConnectionTagsetObject:[NSNumbernumberWithBool:0]forKey:verifyString];
returnYES;
}
}
@end
/**
* 用来封装上传参数
*/
@implementation CJFileConfig
+ (instancetype)fileConfigWithfileData:(NSData *)fileData name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType {
return [[selfalloc] initWithfileData:fileDataname:name fileName:fileNamemimeType:mimeType];
}
- (instancetype)initWithfileData:(NSData *)fileData name:(NSString *)name fileName:(NSString *)fileName mimeType:(NSString *)mimeType {
if (self = [superinit]) {
_fileData = fileData;
_name = name;
_fileName = fileName;
_mimeType = mimeType;
}
returnself;
}
@end
- AFNetWorking 封装
- 封装AFNetWorking
- AFNetworking封装
- 封装网络请求(AFNetworking)
- AFNetWorking封装使用
- AFNetWorking封装请求数据
- AFNetworking 子类化封装
- 浅谈AFNetworking二次封装
- AFNetworking的封装使用
- AFNetWorking的二次封装
- 简单封装AFNetworking
- 简单封装AFNetworking
- 封装了AFNetWorking
- AFNetworking简单封装
- AFNETWorking三方封装
- Swift里封装AFNetworking
- 封装AFNetWorking 3.0
- Swift---AFNetworking封装
- (原创)分享一个实用的圆形ImageView
- Strcpy函数的实现
- 微信扫码绑定及登陆流程.png
- Android:网络层的封装(使用volley)
- mapreduce 的partitioner,GroupComparator,KeyComparator,分布式缓存使用示例
- AFNetworking封装
- 第一行代码-第5章 广播机制
- UC/OS的46个系统函数2
- 设置页面过时时间及重定向 点叉关闭或alt+F4时
- 开发规范:前端代码命名语义化推荐实践
- html怎么引用字体包
- mySql 为查询的结果集增加一个序号字段
- 二、LinQ使用方法
- ScrollView嵌套ListView