最新 AFNetworking 3.0 简单实用封装
AFNetworking 3.0 的到来使我们开发者又方便了许多,话不多说,直接上代码。
1.首先 引入框架AFNetworking框架
GitHub下载地址:https://github.com/AFNetworking/AFNetworking
AFNetworking官网地址:http://afnetworking.com
2.导入AFNetworking 支持框架
#import<MobileCoreServices/MobileCoreServices.h>
#import<SystemConfiguration/SystemConfiguration.h>
3.简单实用封装
AFNManagerDelegate.h
// // AFNManagerDelegate.h // WayCar // // Created by zhitu on 16/1/16. // Copyright © 2016年 Eric. All rights reserved. // #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import "AFNetworking.h" //AF 3.0 版本 #define BASE_URL @"http://xxx.xx.xx.174:80/AppFrameWork" #pragma mark 网络请求类型 enum HTTPMETHOD{ METHOD_GET = 0, //GET请求 METHOD_POST = 1, //POST请求 }; @interface AFNManagerRequest : NSObject /** * 类方法 */ + (AFNManagerRequest *)sharedUtil; /** * iOS自带网络请求框架 */ + (void)requestURL:(NSString *)urlstring httpMethod:(NSString *)method params:(NSMutableDictionary *)params complection:(void(^)(id result))block; /** * AF数据请求 */ +(void)requestAFURL:(NSString *)URLString httpMethod:(NSInteger)method parameters:(id)parameters succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure; /** * 上传单张图片 */ +(void)requestAFURL:(NSString *)URLString parameters:(id)parameters imageData:(NSData *)imageData succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure; /** * 上传多张图片 */ +(void)requestAFURL:(NSString *)URLString parameters:(id)parameters imageDataArray:(NSArray *)imageDataArray succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure; /** * 上传文件 */ +(void)requestAFURL:(NSString *)URLString parameters:(id)parameters fileData:(NSData *)fileData succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure; /*json * @brief 把格式化的JSON格式的字符串转换成字典 * @param jsonString JSON格式的字符串 * @return 返回字典 */ + (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString; /*json * @brief 把字典转换成字符串 * @param jsonString JSON格式的字符串 * @return 返回字符串 */ +(NSString*)URLEncryOrDecryString:(NSDictionary *)paramDict IsHead:(BOOL)_type; @end
AFNManagerDelegate.m
// // AFNManagerDelegate.m // WayCar // // Created by zhitu on 16/1/16. // Copyright © 2016年 Eric. All rights reserved. // #import "AFNManagerRequest.h" @interface AFNManagerRequest() @end @implementation AFNManagerRequest /** * 类方法 */ + (AFNManagerRequest *)sharedUtil { static dispatch_once_t onceToken; static AFNManagerRequest * setSharedInstance; dispatch_once(&onceToken, ^{ setSharedInstance = [[AFNManagerRequest alloc] init]; }); return setSharedInstance; } /** * iOS自带网络请求框架 */ + (void)requestURL:(NSString *)urlstring httpMethod:(NSString *)method params:(NSMutableDictionary *)params complection:(void(^)(id result))block{ //1.构造URL urlstring = [BASE_URL stringByAppendingString:urlstring]; NSURL *url = [NSURL URLWithString:urlstring]; //2.构造request NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setTimeoutInterval:60]; [request setHTTPMethod:method]; //1>拼接请求参数:username=wxhl&password=123456&key=value&.... NSMutableString *paramsString = [NSMutableString string]; NSArray *allKeys = params.allKeys; for (int i=0; i<params.count; i++) { NSString *key = allKeys[i]; NSString *value = params[key]; [paramsString appendFormat:@"%@=%@",key,value]; if (i < params.count-1) { [paramsString appendString:@"&"]; } } //2>添加请求参数: /* 请求参数的格式1: username=wxhl&password=123456&key=value&.... 请求参数的格式2 JSON:{username:wxhl,password:12345,....} */ //将字典 ----> JSON字符串 //JSONKit // NSString *jsonString = [params JSONString]; // NSLog(@"%@",jsonString); /** * 判断请求方式: GET : 参数拼接在URL后面 POST : 参数添加到请求体中 */ if ([method isEqualToString:@"GET"]) { NSString *separe = url.query?@"&":@"?"; NSString *paramsURL = [NSString stringWithFormat:@"%@%@%@",urlstring,separe,paramsString]; request.URL = [NSURL URLWithString:paramsURL]; } else if([method isEqualToString:@"POST"]) { NSData *bodyData = [paramsString dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:bodyData]; } //3.构造连接对象 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (connectionError != nil) { NSLog(@"网络请求失败 : %@",connectionError); return ; } //1.解析JSON // JSON字符串 ---> 字典、数组 id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; //2.回到主线程 dispatch_sync(dispatch_get_main_queue(), ^{ //回调block block(result); }); }]; } /** * AF网络请求 */ +(void)requestAFURL:(NSString *)URLString httpMethod:(NSInteger)method parameters:(id)parameters succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure { // 0.设置API地址 URLString = [NSString stringWithFormat:@"%@%@",BASE_URL,[URLString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]]; DNSLog(@"\n AF网络请求参数列表:%@\n\n 接口名: %@\n\n",parameters,URLString); // 1.创建请求管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.申明返回的结果是二进制类型 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 3.如果报接受类型不一致请替换一致text/html 或者 text/plain manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil]; // 4.请求超时,时间设置 manager.requestSerializer.timeoutInterval = 30; // 5.选择请求方式 GET 或 POST switch (method) { case METHOD_GET: { [manager GET:URLString parameters:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; succeed([AFNManagerRequest dictionaryWithJsonString:responseStr]); DNSLog(@"\n 请求成功:%@\n\n",[AFNManagerRequest dictionaryWithJsonString:responseStr]); } failure:^(NSURLSessionDataTask *task, NSError *error) { failure(error); DNSLog(@"\n 请求失败:%@\n\n",error); }]; } break; case METHOD_POST: { [manager POST:URLString parameters:parameters progress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; succeed([AFNManagerRequest dictionaryWithJsonString:responseStr]); DNSLog(@"\n 请求成功:%@\n\n",[AFNManagerRequest dictionaryWithJsonString:responseStr]); } failure:^(NSURLSessionDataTask *task, NSError *error) { [LCProgressHUD showFailure:@"加载失败"]; failure(error); DNSLog(@"\n 请求失败:%@\n\n",error); }]; } break; default: break; } } /** * 上传单张图片 */ +(void)requestAFURL:(NSString *)URLString parameters:(id)parameters imageData:(NSData *)imageData succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure { // 0.设置API地址 URLString = [NSString stringWithFormat:@"%@%@",BASE_URL,[URLString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]]; DNSLog(@"\n POST上传单张图片参数列表:%@\n\n%@\n",parameters,[AFNManagerRequest URLEncryOrDecryString:parameters IsHead:false]); // 1.创建请求管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.申明返回的结果是二进制类型 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 3.如果报接受类型不一致请替换一致text/html 或者 text/plain manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil]; // 4.请求超时,时间设置 manager.requestSerializer.timeoutInterval = 30; // 5. POST数据 [manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名 // 要解决此问题, // 可以在上传时使用当前的系统事件作为文件名 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyyMMddHHmmss"; // 设置时间格式 NSString *str = [formatter stringFromDate:[NSDate date]]; NSString *fileName = [NSString stringWithFormat:@"%@.png", str]; //将得到的二进制图片拼接到表单中 /** data,指定上传的二进制流;name,服务器端所需参数名*/ [formData appendPartWithFileData:imageData name:@"file" fileName:fileName mimeType:@"image/png"]; }progress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; succeed([AFNManagerRequest dictionaryWithJsonString:responseStr]); } failure:^(NSURLSessionDataTask *task, NSError *error) { failure(error); }]; } /** * 上传多张图片 */ +(void)requestAFURL:(NSString *)URLString parameters:(id)parameters imageDataArray:(NSArray *)imageDataArray succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure { // 0.设置API地址 URLString = [NSString stringWithFormat:@"%@%@",BASE_URL,[URLString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]]; DNSLog(@"\n POST上传多张图片参数列表:%@\n\n%@\n",parameters,[AFNManagerRequest URLEncryOrDecryString:parameters IsHead:false]); // 1.创建请求管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.申明返回的结果是二进制类型 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 3.如果报接受类型不一致请替换一致text/html 或者 text/plain manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil]; // 4.请求超时,时间设置 manager.requestSerializer.timeoutInterval = 30; // 5. POST数据 [manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { for (int i = 0; i<imageDataArray.count; i++){ NSData *imageData = imageDataArray[i]; // 在网络开发中,上传文件时,是文件不允许被覆盖,文件重名 // 要解决此问题, // 可以在上传时使用当前的系统事件作为文件名 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; // 设置时间格式 formatter.dateFormat = @"yyyyMMddHHmmss"; NSString *str = [formatter stringFromDate:[NSDate date]]; NSString *fileName = [NSString stringWithFormat:@"%@.png", str]; NSString *name = [NSString stringWithFormat:@"image_%d.png",i ]; //将得到的二进制图片拼接到表单中 /** data,指定上传的二进制流;name,服务器端所需参数名*/ [formData appendPartWithFileData:imageData name:name fileName:fileName mimeType:@"image/png"]; } }progress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; succeed([AFNManagerRequest dictionaryWithJsonString:responseStr]); } failure:^(NSURLSessionDataTask *task, NSError *error) { failure(error); }]; } /** * 上传文件 */ +(void)requestAFURL:(NSString *)URLString parameters:(id)parameters fileData:(NSData *)fileData succeed:(void (^)(id))succeed failure:(void (^)(NSError *))failure { // 0.设置API地址 URLString = [NSString stringWithFormat:@"%@%@",BASE_URL,[URLString stringByReplacingOccurrencesOfString:@" " withString:@"%20"]]; DNSLog(@"\n POST上传文件参数列表:%@\n\n%@\n",parameters,[Utilit URLEncryOrDecryString:parameters IsHead:false]); // 1.创建请求管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.申明返回的结果是二进制类型 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 3.如果报接受类型不一致请替换一致text/html 或者 text/plain manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain", nil]; // 4.请求超时,时间设置 manager.requestSerializer.timeoutInterval = 30; // 5. POST数据 [manager POST:URLString parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { //将得到的二进制数据拼接到表单中 /** data,指定上传的二进制流;name,服务器端所需参数名*/ [formData appendPartWithFileData :fileData name:@"file" fileName:@"audio.MP3" mimeType:@"audio/MP3"]; }progress:nil success:^(NSURLSessionDataTask *task, id responseObject) { NSString *responseStr = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; succeed([AFNManagerRequest dictionaryWithJsonString:responseStr]); } failure:^(NSURLSessionDataTask *task, NSError *error) { failure(error); }]; } /*json * @brief 把格式化的JSON格式的字符串转换成字典 * @param jsonString JSON格式的字符串 * @return 返回字典 */ +(NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { if (jsonString == nil) { return nil; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *error; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error]; if(error) { DNSLog(@"json解析失败:%@",error); return nil; } return dic; } /*json * @brief 把字典转换成字符串 * @param jsonString JSON格式的字符串 * @return 返回字符串 */ +(NSString*)URLEncryOrDecryString:(NSDictionary *)paramDict IsHead:(BOOL)_type { NSArray *keyAry = [paramDict allKeys]; NSString *encryString = @""; for (NSString *key in keyAry) { NSString *keyValue = [paramDict valueForKey:key]; encryString = [encryString stringByAppendingFormat:@"&"]; encryString = [encryString stringByAppendingFormat:@"%@",key]; encryString = [encryString stringByAppendingFormat:@"="]; encryString = [encryString stringByAppendingFormat:@"%@",keyValue]; } return encryString; } @end<span style="color:#3333ff;"> </span>