配置
1.下载AFNetworking,将2个文件夹:AFNetworking和UIKit+AFNetworking拖入工程
2.导入以下库文件:CFNetwork、Security、SystemConfiguration、MobileCoreServices
3.如果你以前用的是1.0版本,那么AFNetworking 2.0 Migration Guide能帮助你
4.如果你是用CocoaPods配置的,那么
platform:ios,'7.0'
pod"AFNetworking","~>2.0"
一、2大管理对象
1.AFHTTPRequestOperationManager
* 对NSURLConnection的封装
2.AFHTTPSessionManager
* 对NSURLSession的封装
二、对服务器返回数据的解析
1.AFN可以自动对服务器返回的数据进行解析
* 默认将服务器返回的数据当做JSON来解析
2.设置对服务器返回数据的解析方式
1> 当做是JSON来解析(默认做法)
* mgr.responseSerializer = [AFJSONResponseSerializer serializer];
* responseObject的类型是NSDictionary或者NSArray
2> 当做是XML来解析
* mgr.responseSerializer = [AFXMLParserResponseSerializer serializer];
* responseObject的类型是NSXMLParser
3> 直接返回data
* 意思是:告诉AFN不要去解析服务器返回的数据,保持原来的data即可
* mgr.responseSerializer = [AFHTTPResponseSerializer serializer];
3.注意
* 服务器返回的数据一定要跟responseSerializer对得上
1> 服务器返回的是JSON数据
* AFJSONResponseSerializer
* AFHTTPResponseSerializer
2> 服务器返回的是XML数据
* AFXMLParserResponseSerializer
* AFHTTPResponseSerializer
3> 服务器返回的是其他数据
* AFHTTPResponseSerializer
三、AFHTTPRequestOperationManager的具体使用
1.创建管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
2.封装请求参数
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"username"] = @"哈哈哈";
params[@"pwd"] = @"123";
3.发送请求
NSString *url = @"http://localhost:8080/MJServer/login";
[mgr POST:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 请求成功的时候调用这个block
NSLog(@"请求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 请求失败的时候调用调用这个block
NSLog(@"请求失败");
}];
// GET请求
[mgr GET:url parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
// 请求成功的时候调用这个block
NSLog(@"请求成功---%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
// 请求失败的时候调用调用这个block
NSLog(@"请求失败");
}];
文件上传
1.采用AFHTTPRequestOperationManager,无法显示文件进度
// 2.发送一个请求 NSString *url = @"http://localhost:8080/MJServer/upload"; [mgr POST:url parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 在发送请求之前会自动调用这个block // 需要在这个block中添加文件参数到formData中 /** FileURL : 需要上传的文件的URL路径 name : 服务器那边接收文件用的参数名 fileName : (告诉服务器)所上传文件的文件名 mimeType : 所上传文件的文件类型 */ NSURL *url = [[NSBundle mainBundle] URLForResource:@"itcast" withExtension:@"txt"]; [formData appendPartWithFileURL:url name:@"file" fileName:@"test.txt" mimeType:@"text/plain" error:nil]; /** FileData : 需要上传的文件的具体数据 name : 服务器那边接收文件用的参数名 fileName : (告诉服务器)所上传文件的文件名 mimeType : 所上传文件的文件类型 */ // UIImage *image = [UIImage imageNamed:@"minion_01"]; // NSData *fileData = UIImagePNGRepresentation(image); // [formData appendPartWithFileData:fileData name:@"file" fileName:@"haha.png" mimeType:@"image/png"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"上传成功"); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"上传失败"); }];
2.采用
AFHTTPRequestOperation 可以显示文件进度
- (void)uploadImage:(UIImage *)image path:(NSString *)path name:(NSString *)name successBlock:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failureBlock:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure progerssBlock:(void (^)(CGFloat progressValue))progress { NSData *data = UIImageJPEGRepresentation(image, 1.0); if ((float)data.length/1024 > 1000) { data = UIImageJPEGRepresentation(image, 1024*1000.0/(float)data.length); } NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @"yyyyMMddHHmmss"; NSString *str = [formatter stringFromDate:[NSDate date]]; NSString *fileName = [NSString stringWithFormat:@"%@_%@.jpg", [Login curLoginUser].global_key, str]; DebugLog(@"\nuploadImageSize\n%@ : %.0f,name = %@", fileName, (float)data.length/1024,name); AFHTTPRequestOperation *operation = [self POST:path parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { [formData appendPartWithFileData:data name:name fileName:fileName mimeType:@"image/jpeg"]; } success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject); id error = [self handleResponse:responseObject]; if (error && failure) { failure(operation, error); }else{ success(operation, responseObject); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Error: %@ ***** %@", operation.responseString, error); if (failure) { failure(operation, error); } }]; [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite) { CGFloat progressValue = (float)totalBytesWritten/(float)totalBytesExpectedToWrite; if (progress) { progress(progressValue); } }]; [operation start]; }
4.AFURLSessionManager(NSURLSession详细见网络编程(6))
创建和管理制定的NSURLSession对象NSURLSessionConfiguration对象必须实现<NSURLSessionTaskDelegate>, <NSURLSessionDataDelegate>, <NSURLSessionDownloadDelegate>, <NSURLSessionDelegate>协议
创建一个下载任务




3.网络监测(一般会用另一个网络监测类,Reachability,还有JSON解析方法,反正我也一般不用,自行脑补)
AFNetworkReachabilityManager监控网络领域的可达性,WWAN地址和WiFi接口.
当前网络状态

4.AFHTTPRequestOperation
AFHTTPRequestOperation是使用HTTP或HTTPS协议的AFURLConnectionOperation的子类。
它封装的获取后的HTTP状态和类型将决定请求的成功与否。虽然AFHTTPRequestOperationManager通常是最好的去请求的方式,但是AFHTTPRequestOpersion也能够单独使用。
GET请求

AFNetworking 2.x 设置header
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; manager.requestSerializer = [AFJSONRequestSerializer serializer]; manager.responseSerializer = [AFJSONResponseSerializer serializer]; [manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [manager.requestSerializer setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
//设置接收类型
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/plain",@"application/json",@"text/html",nil];
浙公网安备 33010602011771号