AFNetworking是一個輕量級的iOS網絡通訊類庫。它創建在NSURLConnection和NSOperation等類庫的基礎上,讓不少網絡通訊功能的實現變得十分簡單。它支持HTTP請求和基於REST的網絡服務(包括GET、POST、 PUT、DELETE等)。支持ARC。php
1 // 2 // MJViewController.m 3 // 03.AFN演練 4 // 5 // Created by apple on 14-4-30. 6 // Copyright (c) 2014年 itcast. All rights reserved. 7 // 8 9 #import "MJViewController.h" 10 #import "AFNetworking.h" 11 12 @interface MJViewController () 13 14 @end 15 16 @implementation MJViewController 17 /** 18 要使用常規的AFN網絡訪問 19 20 1. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 21 22 全部的網絡請求,均有manager發起 23 24 2. 須要注意的是,默認提交請求的數據是二進制的,返回格式是JSON 25 26 1> 若是提交數據是JSON的,須要將請求格式設置爲AFJSONRequestSerializer 27 2> 若是返回格式不是JSON的, 28 29 3. 請求格式 30 31 AFHTTPRequestSerializer 二進制格式 32 AFJSONRequestSerializer JSON 33 AFPropertyListRequestSerializer PList(是一種特殊的XML,解析起來相對容易) 34 35 4. 返回格式 36 37 AFHTTPResponseSerializer 二進制格式 38 AFJSONResponseSerializer JSON 39 AFXMLParserResponseSerializer XML,只能返回XMLParser,還須要本身經過代理方法解析 40 AFXMLDocumentResponseSerializer (Mac OS X) 41 AFPropertyListResponseSerializer PList 42 AFImageResponseSerializer Image 43 AFCompoundResponseSerializer 組合 44 */ 45 46 - (void)viewDidLoad 47 { 48 [super viewDidLoad]; 49 50 [self reach]; 51 } 52 53 #pragma mark - 演練 54 #pragma mark - 檢測網絡鏈接 55 - (void)reach 56 { 57 /** 58 AFNetworkReachabilityStatusUnknown = -1, // 未知 59 AFNetworkReachabilityStatusNotReachable = 0, // 無鏈接 60 AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花錢 61 AFNetworkReachabilityStatusReachableViaWiFi = 2, // 局域網絡,不花錢 62 */ 63 // 若是要檢測網絡狀態的變化,必須用檢測管理器的單例的startMonitoring 64 [[AFNetworkReachabilityManager sharedManager] startMonitoring]; 65 66 // 檢測網絡鏈接的單例,網絡變化時的回調方法 67 [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { 68 NSLog(@"%d", status); 69 }]; 70 } 71 72 #pragma mark - Session 下載 73 - (void)sessionDownload 74 { 75 NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 76 AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:config]; 77 78 NSString *urlString = @"http://localhost/itcast/videos/01.C語言-語法預覽.mp4"; 79 urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 80 81 NSURL *url = [NSURL URLWithString:urlString]; 82 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 83 84 NSURLSessionDownloadTask *task = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) { 85 // 指定下載文件保存的路徑 86 // NSLog(@"%@ %@", targetPath, response.suggestedFilename); 87 // 將下載文件保存在緩存路徑中 88 NSString *cacheDir = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; 89 NSString *path = [cacheDir stringByAppendingPathComponent:response.suggestedFilename]; 90 91 // URLWithString返回的是網絡的URL,若是使用本地URL,須要注意 92 NSURL *fileURL1 = [NSURL URLWithString:path]; 93 NSURL *fileURL = [NSURL fileURLWithPath:path]; 94 95 NSLog(@"== %@ |||| %@", fileURL1, fileURL); 96 97 return fileURL; 98 } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) { 99 NSLog(@"%@ %@", filePath, error); 100 }]; 101 102 [task resume]; 103 } 104 105 #pragma mark - POST JSON 106 - (void)postJSON 107 { 108 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 109 110 NSDictionary *dict = @{@"name": @"zhangsan"}; 111 NSDictionary *dict1 = @{@"name": @"wangwu"}; 112 NSArray *array = @[dict, dict1]; 113 // 設置請求格式 114 manager.requestSerializer = [AFJSONRequestSerializer serializer]; 115 // 設置返回格式 116 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 117 118 [manager POST:@"http://localhost/postjson.php" parameters:array success:^(AFHTTPRequestOperation *operation, id responseObject) { 119 NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 120 121 NSLog(@"%@", result); 122 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 123 124 }]; 125 126 } 127 128 #pragma mark - 隨機文件名上傳 129 - (void)postUpload1 130 { 131 // 本地上傳給服務器時,沒有肯定的URL,很差用MD5的方式處理 132 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 133 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 134 135 [manager POST:@"http://localhost/demo/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 136 137 NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil]; 138 139 // 要上傳保存在服務器中的名稱 140 // 使用時間來做爲文件名 2014-04-30 14:20:57.png 141 // 讓不一樣的用戶信息,保存在不一樣目錄中 142 NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; 143 // 設置日期格式 144 formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss"; 145 NSString *fileName = [formatter stringFromDate:[NSDate date]]; 146 147 [formData appendPartWithFileURL:fileURL name:@"uploadFile" fileName:fileName mimeType:@"image/png" error:NULL]; 148 149 } success:^(AFHTTPRequestOperation *operation, id responseObject) { 150 NSLog(@"OK"); 151 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 152 NSLog(@"error"); 153 }]; 154 } 155 156 #pragma mark - POST上傳 157 - (void)postUpload 158 { 159 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 160 // AFHTTPResponseSerializer就是正常的HTTP請求響應結果:NSData 161 // 當請求的返回數據不是JSON,XML,PList,UIImage以外,使用AFHTTPResponseSerializer 162 // 例如返回一個html,text... 163 // 164 // 實際上就是AFN沒有對響應數據作任何處理的狀況 165 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 166 167 // formData是遵照了AFMultipartFormData的對象 168 [manager POST:@"http://localhost/demo/upload.php" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 169 170 // 將本地的文件上傳至服務器 171 NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"頭像1.png" withExtension:nil]; 172 173 [formData appendPartWithFileURL:fileURL name:@"uploadFile" error:NULL]; 174 } success:^(AFHTTPRequestOperation *operation, id responseObject) { 175 NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; 176 177 NSLog(@"完成 %@", result); 178 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 179 NSLog(@"錯誤 %@", error.localizedDescription); 180 }]; 181 } 182 183 #pragma mark - JSON 184 - (void)XMLData 185 { 186 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 187 188 // 返回的數據格式是XML 189 manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; 190 191 NSDictionary *dict = @{@"format": @"xml"}; 192 193 // 網絡訪問是異步的,回調是主線程的,所以程序員不用管在主線程更新UI的事情 194 [manager GET:@"http://localhost/videos.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) { 195 196 // 若是結果是XML,一樣須要使用6個代理方法解析,或者使用第三方庫 197 // 第三方庫第三方框架,效率低,內存泄漏 198 NSLog(@"%@", responseObject); 199 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 200 NSLog(@"%@", error); 201 }]; 202 } 203 204 #pragma mark - JSON 205 - (void)JSONData 206 { 207 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 208 209 // 本來須要拼接get訪問URL ? & = 210 NSDictionary *dict = @{@"format": @"json"}; 211 212 // 網絡訪問是異步的,回調是主線程的,所以程序員不用管在主線程更新UI的事情 213 [manager GET:@"http://localhost/videos.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) { 214 NSLog(@"%@", responseObject); 215 // 提問:NSURLConnection異步方法回調,是在子線程 216 // 獲得回調以後,一般更新UI,是在主線程 217 NSLog(@"%@", [NSThread currentThread]); 218 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 219 NSLog(@"%@", error); 220 }]; 221 } 222 223 #pragma mark - POST登陸 224 - (void)postLogin 225 { 226 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 227 228 // 本來須要拼接get訪問URL ? & = 229 NSDictionary *dict = @{@"username": @"wangwu", @"password" : @"wang"}; 230 231 // 網絡訪問是異步的,回調是主線程的,所以程序員不用管在主線程更新UI的事情 232 [manager POST:@"http://localhost/login.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) { 233 NSLog(@"%@", responseObject); 234 // 提問:NSURLConnection異步方法回調,是在子線程 235 // 獲得回調以後,一般更新UI,是在主線程 236 NSLog(@"%@", [NSThread currentThread]); 237 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 238 NSLog(@"%@", error); 239 }]; 240 } 241 242 #pragma mark - GET登陸 243 - (void)getLogin 244 { 245 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 246 247 // 本來須要拼接get訪問URL ? & = 248 NSDictionary *dict = @{@"username": @"wangwu", @"password" : @"wang"}; 249 250 // 網絡訪問是異步的,回調是主線程的,所以程序員不用管在主線程更新UI的事情 251 [manager GET:@"http://localhost/login.php" parameters:dict success:^(AFHTTPRequestOperation *operation, id responseObject) { 252 NSLog(@"%@", responseObject); 253 // 提問:NSURLConnection異步方法回調,是在子線程 254 // 獲得回調以後,一般更新UI,是在主線程 255 NSLog(@"%@", [NSThread currentThread]); 256 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 257 NSLog(@"%@", error); 258 }]; 259 } 260 261 @end