#import "ViewController.h" #import <AFNetworking/AFNetworking.h> #import "NSString+NJ.h" @interface ViewController () @property (nonatomic, strong) NSProgress *progress; /**< 进度 */ @end @implementation ViewController - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self upload]; } // AFN对NSURLConnection封装 - (void)get { // 1.创建AFN管理者 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 2.利用AFN管理者发送请求 /* 第1个参数: 需要请求的URL地址字符串 第2个参数: 请求时需要传递的参数 第3个参数: 请求成功的回调 第4个参数: 请求失败的回调 */ // 注意: 字典参数中不需要写? , AFN会自动添加 NSDictionary *dict = @{ @"username":@"520it", @"pwd":@"520it", @"type":@"JSON", }; [manager GET:@"http://120.25.226.186:32812/login" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) { // responseObject 服务器返回的数据 // 注意点: 如果服务器返回的是JSON, AFN会自动转换为OC对象 // NSLog(@"%@", [responseObject class]); NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error"); }]; } - (void)post { // 1.创建AFN管理者 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; // 2.利用AFN管理者发送请求 NSDictionary *dict = @{ @"username":@"520it", @"pwd":@"520it", @"type":@"JSON", }; [manager POST:@"http://120.25.226.186:32812/login" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error"); }]; } // AFN对NSURLSession封装 - (void)get2 { // 1.创建AFN管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.利用AFN发送请求 NSDictionary *dict = @{ @"username":@"520it", @"pwd":@"520it", @"type":@"JSON", }; [manager GET:@"http://120.25.226.186:32812/login" parameters:dict success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"%@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"error"); }]; } - (void)post2 { // 1.创建AFN管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.利用AFN发送请求 NSDictionary *dict = @{ @"username":@"520it", @"pwd":@"520it", @"type":@"JSON", }; [manager POST:@"http://120.25.226.186:32812/login" parameters:dict success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"%@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"error"); }]; } - (void)download { // 1.创建AFN管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.利用AFN下载文件 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/images/minion_02.png"]]; NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { // 请求完成的回调 // targetPath : 下载好的文件的路径 // response: 响应头 // block的返回值: 告诉AFN框架, 是否需要将下载好的文件移动到其它路径下 NSLog(@"targetPath = %@", targetPath); NSString *path = [response.suggestedFilename cacheDir]; NSURL *destURL = [NSURL fileURLWithPath:path]; NSLog(@"destURL = %@", destURL); return destURL; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { // 下载完成的回调 // filePath : 移动之后的文件路径 NSLog(@"filePath = %@", filePath); }]; [task resume]; } - (void)download2 { // 1.创建AFN管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 创建NSProgress /* @property int64_t totalUnitCount; 需要下载文件的总大小 @property int64_t completedUnitCount; 已经下载文件的总大小 */ NSProgress *progress = nil; self.progress = progress; // 2.利用AFN下载文件 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://120.25.226.186:32812/resources/videos/minion_02.mp4"]]; // 只要将NSProgress对象传递给AFN, AFN就会在内部自动给NSProgress赋值 \会自动修改NSProgress的下载进度 NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:&progress destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { // 请求完成的回调 NSString *path = [response.suggestedFilename cacheDir]; NSURL *destURL = [NSURL fileURLWithPath:path]; return destURL; } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { // 下载完成的回调 // filePath : 移动之后的文件路径 NSLog(@"filePath = %@", filePath); }]; // 给NSProgress注册监听, 监听它的completedUnitCount属性的改变 [progress addObserver:self forKeyPath:@"completedUnitCount" options:NSKeyValueObservingOptionNew context:nil]; // 注意: 必须手动执行才会开始下载 [task resume]; // NSLog(@"%@", progress); } - (void)dealloc { [self removeObserver:self.progress forKeyPath:@"completedUnitCount"]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { // NSLog(@"%@", object); if ([object isKindOfClass:[NSProgress class]]) { NSProgress *progress = (NSProgress *)object; // 计算下载进度 NSLog(@"%f", 1.0 * progress.completedUnitCount / progress.totalUnitCount); } } - (void)upload { // 1.创建AFN管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 2.利用AFN上传文件 NSDictionary *dict = @{ @"username":@"lnj" }; [manager POST:@"http://120.25.226.186:32812/upload" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { // 在这个block中上传文件数据 // formData就是专门用于保存需要上传文件的二进制数据的 NSData *data = [NSData dataWithContentsOfFile:@"/Users/xiaomage/Desktop/Snip20150824_1.png"]; // 注意: 该方法不能用于POST上传 // [formData appendPartWithFormData:data name:@"file"]; /* 第一个参数: 需要上传的文件二进制 第二个参数: 服务器对应的参数名称 第三个参数: 文件的名称 第四个参数: 文件的MIME类型 */ // [formData appendPartWithFileData:data name:@"file" fileName:@"abc.png" mimeType:@"image/png"]; /* 第一个参数: 需要上传的文件的URL 第二个参数: 服务器对应的参数名称 第三个参数: 文件的名称 第四个参数: 文件的MIME类型 */ NSURL *url = [NSURL fileURLWithPath:@"/Users/yedayi/Desktop/1.png"]; // [formData appendPartWithFileURL:url name:@"file" fileName:@"def.png" mimeType:@"image/png" error:nil]; // 如果使用以下方法上传文件, AFN会自动获取文件的名称和类型 [formData appendPartWithFileURL:url name:@"file" error:nil]; } success:^(NSURLSessionDataTask *task, id responseObject) { NSLog(@"成功的回调 %@", responseObject); } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"失败的回调"); }]; NSLog(@"---------------"); } - (void)serializer { // 1.创建AFN管理者 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; // 如果服务器返回的不是JSON数据, 那么需要提前告诉AFN如何处理处理数据 // 只要给AFN的responseSerializer属性, 赋值为AFXMLParserResponseSerializer, 以后AFN就会将服务器返回的数据当做XML来处理 // manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; // 只要给AFN的responseSerializer属性, 赋值为AFHTTPResponseSerializer, 以后AFN就会将服务器返回的数据当做二进制来处理, 也就是说不做任何处理 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; // 2.利用AFN发送请求 NSDictionary *dict = @{ @"username":@"520it", @"pwd":@"520it", @"type":@"XML", }; [manager POST:@"http://120.25.226.186:32812/resources/images/minion_02.png" parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { // 注意: AFN默认会将服务器返回的数据当做JSON处理 // 如果服务器返回的是JSON数据, 那么会自动转换为OC对象 NSLog(@"%@", responseObject); // 只要设置AFN的responseSerializer为XML, 那么返回的responseObject就是NSXMLParser解析器 } failure:^(NSURLSessionDataTask *task, NSError *error) { NSLog(@"error"); }]; } @end