#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "AFNetworking.h"
@interface AFCNetFaliedModel : NSObject
@property(nonatomic,assign) NSInteger code;
@property(nonatomic,copy) NSString * message;
@property(nonatomic,copy) NSError * error;
@end
/**
将JSON数据中的 null 转为@""
*/
@interface NSDictionary (NSNull)
+(NSDictionary *)nullDic:(NSDictionary *)myDic;
+(NSArray *)nullArr:(NSArray *)myArr;
@end
/*
* 请求成功block
*/
typedef void (^AFCSuccessBlock)(NSDictionary * OCJSON);
/*
* 请求失败block
*/
typedef void (^AFCFaliedBlock)(AFCNetFaliedModel * faliedModel);
/*
* 视频上传进度
*/
typedef void(^ UploadProgress)(CGFloat Progress);
@interface AFCNet : NSObject
/** GET请求*/
+(void)GET:(NSString *)urlStr Param:(NSDictionary *)param Success:(AFCSuccessBlock)success Falied:(AFCFaliedBlock)falied;
/** POST请求*/
+(void)POST:(NSString *)urlStr Param:(NSDictionary *)param Success:(AFCSuccessBlock)success Falied:(AFCFaliedBlock)falied;
/** POST上传单张图片*/
+(void)POST:(NSString *) urlStr Param:(NSDictionary *)param image:(UIImage *) image Success:(AFCSuccessBlock)
succes Falied:(AFCFaliedBlock) falied;
/** POST提交视频*/
+(void)POST:(NSString *) urlStr Param:(NSDictionary *)param videoData:(NSData *) data UploadProgress:(UploadProgress ) progress Success:(AFCSuccessBlock) succes Falied:(AFCFaliedBlock) falied;
/** POST上传单张图片 scale*/
+(void)POST:(NSString *) urlStr Param:(NSDictionary *)param image:(UIImage *) image scale:(CGFloat)scale Success:(AFCSuccessBlock)
success Falied:(AFCFaliedBlock) falied;
@end
#import "AFCNet.h"
static AFHTTPSessionManager * manager;
#define BaseUrlStr @""
@implementation AFCNet
+ (void)getAFCNetManager{
if(manager==nil){
manager=[AFHTTPSessionManager manager];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.requestSerializer.timeoutInterval = 20;
//manager.requestSerializer setValue:@"" forHTTPHeaderField:@""
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/html",@"text/json",@"text/javascript",@"image/jpeg", nil];
//AFSecurityPolicy *security = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
//[security setValidatesDomainName:NO];
//security.allowInvalidCertificates = YES;
//manager.securityPolicy = security;
}
}
/** GET请求*/
+(void)GET:(NSString *)urlStr Param:(NSDictionary *)param Success:(AFCSuccessBlock)success Falied:(AFCFaliedBlock)falied{
[self getAFCNetManager];
NSString * url = [BaseUrlStr stringByAppendingString:urlStr];
[manager GET:url parameters:param progress:^(NSProgress * _Nonnull downloadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSError *error;
NSDictionary * OCJSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error];
if (error != nil){
AFCNetFaliedModel * faliedModel = [AFCNetFaliedModel new];
faliedModel.code = 0;
faliedModel.message = @"数据解析出错";
falied(faliedModel);
}else{
[self handleRequestSuccessData:OCJSON Success:success Falied:falied];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self handleRequestFaliedError:error Falied:falied];
}];
}
/** POST请求*/
+(void)POST:(NSString *)urlStr Param:(NSDictionary *)param Success:(AFCSuccessBlock)success Falied:(AFCFaliedBlock)falied{
[self getAFCNetManager];
NSString * url = [BaseUrlStr stringByAppendingString:urlStr];
[manager POST:url parameters:param progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSError *error;
NSDictionary * OCJSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error];
if (error != nil){
AFCNetFaliedModel * faliedModel = [AFCNetFaliedModel new];
faliedModel.code = 0;
faliedModel.message = @"数据解析出错";
falied(faliedModel);
}else{
[self handleRequestSuccessData:OCJSON Success:success Falied:falied];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self handleRequestFaliedError:error Falied:falied];
}];
}
/** POST上传单张图片*/
+(void)POST:(NSString *) urlStr Param:(NSDictionary *)param image:(UIImage *) image Success:(AFCSuccessBlock)
success Falied:(AFCFaliedBlock) falied{
[self getAFCNetManager];
NSString * url = [BaseUrlStr stringByAppendingString:urlStr];
[manager POST:url parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// 1、对图片压缩
NSData * imageData = UIImageJPEGRepresentation(image, 0.5);
// 2、上传的参数名 以当前时间为参数名 保证所有参数名不一样
NSDate *currentDate = [NSDate date];//获取当前时间,日期
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd-HH:mm:ss:SS"];
NSString * Name = [dateFormatter stringFromDate:currentDate];
// 3、上传filename
NSString * fileName = [NSString stringWithFormat:@"%@.png", Name];
[formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/png"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
//NSLog(@"图片上传进度 == %f ",uploadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSError *error;
NSDictionary * OCJSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error];
if (error != nil){
AFCNetFaliedModel * faliedModel = [AFCNetFaliedModel new];
faliedModel.code = 0;
faliedModel.message = @"数据解析出错";
falied(faliedModel);
}else{
[self handleRequestSuccessData:OCJSON Success:success Falied:falied];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self handleRequestFaliedError:error Falied:falied];
}];
}
/** POST上传单张图片*/
+(void)POST:(NSString *) urlStr Param:(NSDictionary *)param image:(UIImage *) image scale:(CGFloat)scale Success:(AFCSuccessBlock)
success Falied:(AFCFaliedBlock) falied{
[self getAFCNetManager];
NSString * url = [BaseUrlStr stringByAppendingString:urlStr];
[manager POST:url parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
// 1、对图片压缩
NSData * imageData = UIImageJPEGRepresentation(image, scale);
NSLog(@"比例:%f,大小:%lu k",scale,(unsigned long)imageData.length/1024);
// 2、上传的参数名 以当前时间为参数名 保证所有参数名不一样
NSDate *currentDate = [NSDate date];//获取当前时间,日期
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd-HH:mm:ss:SS"];
NSString * Name = [dateFormatter stringFromDate:currentDate];
// 3、上传filename
NSString * fileName = [NSString stringWithFormat:@"%@.png", Name];
[formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/png"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
//NSLog(@"图片上传进度 == %f ",uploadProgress.fractionCompleted);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSError *error;
NSDictionary * OCJSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error];
if (error != nil){
AFCNetFaliedModel * faliedModel = [AFCNetFaliedModel new];
faliedModel.code = 0;
faliedModel.message = @"数据解析出错";
falied(faliedModel);
}else{
[self handleRequestSuccessData:OCJSON Success:success Falied:falied];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self handleRequestFaliedError:error Falied:falied];
}];
}
/** POST提交视频*/
+(void)POST:(NSString *) urlStr Param:(NSDictionary *)param videoData:(NSData *) data UploadProgress:(UploadProgress ) progress Success:(AFCSuccessBlock) success Falied:(AFCFaliedBlock) falied{
[self getAFCNetManager];
NSString * url = [BaseUrlStr stringByAppendingString:urlStr];
[manager POST:url parameters:param constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) {
[formData appendPartWithFileData:data name:@"file" fileName:@"video1.mov" mimeType:@"video/quicktime"];
} progress:^(NSProgress * _Nonnull uploadProgress) {
progress(uploadProgress.completedUnitCount / uploadProgress.totalUnitCount*1.00);
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSError *error;
NSDictionary * OCJSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:&error];
if (error != nil){
AFCNetFaliedModel * faliedModel = [AFCNetFaliedModel new];
faliedModel.code = 0;
faliedModel.message = @"数据解析出错";
falied(faliedModel);
}else{
[self handleRequestSuccessData:OCJSON Success:success Falied:falied];
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
[self handleRequestFaliedError:error Falied:falied];
}];
}
#pragma mark - 每个项目返回数据结构不一样,是协商而定
/** 处理请求成功数据*/
+(void)handleRequestSuccessData:(NSDictionary *)ocJson Success:(AFCSuccessBlock)success Falied:(AFCFaliedBlock)falied{
success(ocJson);
}
/** 处理请求失败数据*/
+(void)handleRequestFaliedError:(NSError *)error Falied:(AFCFaliedBlock)falied{
AFCNetFaliedModel * faliedModel = [AFCNetFaliedModel new];
faliedModel.code = 0;
faliedModel.message = @"";
faliedModel.error = error;
falied(faliedModel);
}
@end
@implementation AFCNetFaliedModel
@end
@implementation NSDictionary (NSNull)
//将NSDictionary中的Null类型的项目转化成@""
+(NSDictionary *)nullDic:(NSDictionary *)myDic
{
NSArray *keyArr = [myDic allKeys];
NSMutableDictionary *resDic = [[NSMutableDictionary alloc]init];
for (int i = 0; i < keyArr.count; i ++)
{
id obj = [myDic objectForKey:keyArr[i]];
obj = [self changeType:obj];
[resDic setObject:obj forKey:keyArr[i]];
}
return resDic;
}
//将NSDictionary中的Null类型的项目转化成@""
+(NSArray *)nullArr:(NSArray *)myArr
{
NSMutableArray *resArr = [[NSMutableArray alloc] init];
for (int i = 0; i < myArr.count; i ++)
{
id obj = myArr[i];
obj = [self changeType:obj];
[resArr addObject:obj];
}
return resArr;
}
//将NSString类型的原路返回
+(NSString *)stringToString:(NSString *)string
{
return string;
}
//将Null类型的项目转化成@""
+(NSString *)nullToString
{
return @"";
}
#pragma mark - 公有方法
//类型识别:将所有的NSNull类型转化成@""
+(id)changeType:(id)myObj
{
if ([myObj isKindOfClass:[NSDictionary class]])
{
return [self nullDic:myObj];
}
else if([myObj isKindOfClass:[NSArray class]])
{
return [self nullArr:myObj];
}
else if([myObj isKindOfClass:[NSString class]])
{
return [self stringToString:myObj];
}
else if([myObj isKindOfClass:[NSNull class]])
{
return [self nullToString];
}
else
{
return myObj;
}
}
@end