這裏對網絡請求方式作一個總結。api
原生方式同步GET請求:網絡
1 NSString *urlStr = @"http://apis.juhe.cn/mobile/get?phone=13429667914&key=e87a054855796995c9e2b48e8514d0da"; 2 urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 3 NSURL *url = [NSURL URLWithString:urlStr]; 4 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15]; 5 NSURLResponse *response = nil; 6 NSError *error = nil; 7 NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 8 NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 9 NSLog(@"%@", responseString);
原生方式異步GET請求:app
1 NSString *urlStr = @"http://apis.juhe.cn/mobile/get?phone=13429667914&key=e87a054855796995c9e2b48e8514d0da"; 2 urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 3 NSURL *url = [NSURL URLWithString:urlStr]; 4 NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:15]; 5 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 6 NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 7 NSLog(@"%@", responseString); 8 }];
可見,請求分爲兩部分,一是構建請求,二是發送請求。構建分爲GET和POST,發送分爲同步和異步。框架
POST請求的請求部分須要將參數構建爲NSData類型:異步
1 NSString *urlStr = @"http://apis.juhe.cn/mobile/get?"; 2 urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 3 NSURL *url = [NSURL URLWithString:urlStr]; 4 5 //建立請求,配置參數的data 6 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30]; 7 [request setHTTPMethod:@"POST"]; 8 NSString *otherURLstr = @"phone=13429667914&key=e87a054855796995c9e2b48e8514d0da"; 9 NSData *otherURLData = [otherURLstr dataUsingEncoding:NSUTF8StringEncoding]; 10 [request setHTTPBody:otherURLData];
原生方式寫出來的代碼老是一坨,下面看看AFN對請求的封裝。AFN須要添加MobileCoreService和SystemConfiguration框架,並在pch里加入頭文件:url
1 #import <MobileCoreServices/MobileCoreServices.h> 2 #import <SystemConfiguration/SystemConfiguration.h>
在使用時須要引入頭文件:spa
1 #import "AFNetworking.h"
GET和POST的請求的構建仍是和前面同樣,發送處:code
1 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 2 [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 3 NSLog(@"%@", operation.responseString); 4 } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 5 NSLog(@"%@", [error localizedDescription]); 6 }]; 7 [operation start];
AFHTTPRequestOperation是操做隊列的子類,顯然AFN的請求是異步的(固然,既然是操做隊列,就能夠用操做隊列的方法控制它),請求完成後觸發回調。blog
AFN支持自動解析JSON並轉化爲詞典結構:隊列
1 AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { 2 NSLog(@"%@", JSON); 3 } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) { 4 }]; 5 [operation start];
可是我的不建議使用它解析XML,由於它採用的是XMLParser的方式,很繁瑣。
可是這仍是顯得一坨一坨的,因而有兩種辦法,第一種就是再封裝一層簡單的API,就像jQueryAjax同樣,第二種就是每次用的時候複製粘貼啦~
使用AFN也能夠很方便地實現文件異步下載:
1 //目標地址 2 NSURL *url = [NSURL URLWithString:@"http://www.baidu.com/img/baidu_sylogo1.gif"]; 3 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 4 5 //構建AFN操做 6 AFURLConnectionOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request]; 7 8 //設置輸出流 9 NSArray *documents = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 10 NSString *downloadPath = [documents[0] stringByAppendingPathComponent:@"1.gif"]; 11 [operation setOutputStream:[NSOutputStream outputStreamToFileAtPath:downloadPath append:NO]]; 12 13 //下載過程中的block(檢測進度) 14 [operation setDownloadProgressBlock:^(NSUInteger bytesRead, long long totalBytesRead, long long totalBytesExpectedToRead) { 15 NSLog(@"下載百分比:%f", (float)totalBytesRead / totalBytesExpectedToRead); 16 }]; 17 18 //下載完成 19 [operation setCompletionBlock:^{ 20 NSLog(@"操做完成"); 21 }];