【iOS】網絡操作與AFNetworking

衆所周知,蘋果搞的一套框架NSContention發送請求與接收請求的方式十分繁瑣。操作起來很不方便。不僅要做區分各種請求設置各種不同的參數,而且還要經常在多線程裏操作,同時還要對請求與返回的數據做各種序列化的操作,同時還要考慮請求數據的安全等一堆問題。


一、早前的幾個網絡框架
1、ASI框架HTTP終結者.很牛, 但是有BUG, 已經停止更新.
2、MKNetworkKit (印度人寫的).
3、AFN一直還在更新.

AFNetworking的出現:MAC/iOS設計的一套網絡框架.(爲了簡化網絡操作)

*AFN專注與網絡數據傳輸,以及網絡中多線程的處理.

二、AFNetworking的使用

1、AFN特性 :
*登錄傳參數時,傳遞字典即可.(鍵名爲參數名,鍵值爲參數值).
*自動到子線程中執行,執行完後返回主線程.
*返回的結果自動序列化NSDictionary.

2、使用AFN注意 :
*AFHTTPRequestOperationManager封裝了通過HTTP協議與Web應用程序進行通訊的常用方法.(這個實例化的時候不是單例, 因爲沒有shared)
*包括創建請求/響應序列化/網絡監控/數據安全.
*方法等都是AF開頭的.

3、AFN能做的 (網絡中的都涵蓋了):
*GET/POST/PUT/DELETE/HEAD請求.
*JSON數據解析/Plist數據解析.(不支持XML數據解析)
*POSTJSON.
*上傳/下載.

4、使用步驟 : (可參考說明文檔)
1.首先需要實例化一個請求管理器AFHTTPRequestOperationManager.
2.設置請求的數據格式:默認是二進制.(不是可改)
*AFHTTPRequestSerializer(二進制)
*AFJSONRequestSerializer(JSON)
*AFPropertyListRequestSerializer(Plist)
3.設置響應的數據格式:默認是JSON.(不是可改)
*AFHTTPResponseSerializer(二進制)
*AFJSONResponseSerializer(JSON)
*AFPropertyListResponseSerializer(Plist)
*AFXMLParserResponseSerializer(XML)
*AFImageResponseSerializer(Image)
*AFCompoundResponseSerializer(組合的)
4.如果響應者的MIMEType不正確,就要修改acceptableContentTypes.
5.調用方法,發送響應的請求(GET/POST...).

關於修改AFN源碼:通常序列化時做對text/plan等的支持時,可以一勞永逸的修改源代碼,在acceptableContentTypes中修改即可。

AFN進行GET、POST登錄:

[objc] view plaincopy
  1. #pragma mark - get/post登錄  
  2. - (void)getLogin {  
  3.     //1.管理器  
  4.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  5.   
  6.     //2.設置登錄參數  
  7.     NSDictionary *dict = @{ @"username":@"xn"@"password":@"123" };  
  8.   
  9.     //3.請求  
  10.     [manager GET:@"http://localhost/login.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
  11.         NSLog(@"GET --> %@, %@", responseObject, [NSThread currentThread]); //自動返回主線程  
  12.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
  13.         NSLog(@"%@", error);  
  14.     }];  
  15. }  
  16.   
  17. /** 
  18.  *  和上面的GET用法完全一樣, 只有一個POST參數不一樣 
  19.  */  
  20. - (void)postLogin {  
  21.     //1.管理器  
  22.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  23.   
  24.     //2.設置登錄參數  
  25.     NSDictionary *dict = @{ @"username":@"xn"@"password":@"123" };  
  26.   
  27.     //3.請求  
  28.     [manager POST:@"http://localhost/login.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
  29.         NSLog(@"POST --> %@, %@", responseObject, [NSThread currentThread]); //自動返回主線程  
  30.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
  31.         NSLog(@"%@", error);  
  32.     }];  
  33. }  

AFN進行網絡數據解析,獲取Plist,JSON,XMLAFN不支持自動解析XML,有專門的框架去做,如SAX,PULL,KissXML等)

[objc] view plaincopy
  1. #pragma mark - get 數據解析  
  2. - (void)getJSON {  
  3.     //1.請求管理器  
  4.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  5.   
  6.     //2.發起請求  
  7.     [manager GET:@"http://localhost/videos.json" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
  8.         NSLog(@"%@", responseObject);  
  9.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
  10.         NSLog(@"%@", error);  
  11.     }];  
  12. }  
  13.   
  14. /** 
  15.  *  不支持XML數據解析 
  16.  */  
  17. - (void)getXML {  
  18.     //1.管理器  
  19.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  20.   
  21.     //2.設置返回數據類型  
  22.     manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; //先實例化一下  
  23.   
  24.     //3.發起請求  
  25.     [manager GET:@"http://localhost/videos.xml" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
  26.         NSLog(@"%@", responseObject);  
  27.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
  28.         NSLog(@"%@", error);  
  29.     }];  
  30. }  
  31.   
  32. - (void)getPlist {  
  33.     //1.管理器  
  34.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  35.   
  36.     //2.設置response類型  
  37.     manager.responseSerializer = [AFPropertyListResponseSerializer serializer]; //是Response, 別寫成request了. 修改爲plist類型.  
  38.     manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; //這個可以直接往框架裏面修改.  
  39.   
  40.     //3.請求  
  41.     [manager GET:@"http://localhost/videos.plist" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
  42.         NSLog(@"%@", responseObject);  
  43.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
  44.         NSLog(@"%@", error);  
  45.     }];  
  46. }  

用AFN來POST JSON數據,上傳、下載等。(上傳、下載主頁說明上有https://github.com/AFNetworking/AFNetworking

[objc] view plaincopy
  1. #pragma mark - post json數據與上傳文件等  
  2. - (void)postJSON {  
  3.     //1.管理器  
  4.     AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];  
  5.   
  6.     //2.設定類型. (這裏要設置request-response的類型)  
  7.     manager.requestSerializer = [AFJSONRequestSerializer serializer];  
  8.     manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //這個決定了下面responseObject返回的類型  
  9. //    manager.responseSerializer = [AFJSONResponseSerializer serializer];  
  10. //  manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];  
  11.       
  12.     //2.設置登錄參數  
  13.     NSDictionary *dict = @{ @"username":@"xn"@"password":@"123" };  
  14.   
  15.     //3.發送請求  
  16.     [manager POST:@"http://localhost/postjson.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {  
  17. //      NSLog(@"postjson--> %@", responseObject);  //這樣顯示JSON的話需要設置text/plain  
  18.         NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];  
  19.         NSLog(@"%@",result);  
  20.     } failure: ^(AFHTTPRequestOperation *operation, NSError *error) {  
  21.         NSLog(@"%@", error);  
  22.     }];  
  23. }  

轉載請註明出處:http://blog.csdn.net/xn4545945  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章