標籤:
1、概述
AFNetworking簡稱AFN,是iOS開發中主流第三方架構之一。蘋果的一套架構NSContention發送請求與接收請求的方式十分繁瑣。操作起來很不方便。不僅要做區分各種請求設定各種不同的參數,而且還要經常在多線程裡操作,同時還要對請求與返回的資料做各種序列化的操作,同時還要考慮請求資料的安全等一堆問題。而AFNetworking幫我們簡化了網路操作。
2、早前的幾個網路架構
1、ASI架構: HTTP終結者.很牛, 但是有BUG, 已經停止更新.
2、MKNetworkKit (印度人寫的).
3、AFN一直還在更新.
AFNetworking的出現:MAC/iOS設計的一套網路架構.(為了簡化網路操作)
地址:https://github.com/AFNetworking/AFNetworking
*AFN專註與網路資料轉送,以及網路中多線程的處理.
3、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登入:
#pragma mark - get/post登入- (void)getLogin {//1.管理器AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];//2.設定登入參數NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };//3.請求[manager GET:@"http://localhost/login.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"GET --> %@, %@", responseObject, [NSThread currentThread]); //自動返回主線程} failure: ^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error);}];}/** * 和上面的GET用法完全一樣, 只有一個POST參數不一樣 */- (void)postLogin {//1.管理器AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];//2.設定登入參數NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };//3.請求[manager POST:@"http://localhost/login.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"POST --> %@, %@", responseObject, [NSThread currentThread]); //自動返回主線程} failure: ^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error);}];}
AFN進行網路資料解析,擷取Plist,JSON,XML(AFN不支援自動解析XML,有專門的架構去做,如SAX,PULL,KissXML等):
#pragma mark - get 資料解析- (void)getJSON {//1.要求管理器AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];//2.發起請求[manager GET:@"http://localhost/videos.json" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject);} failure: ^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error);}];}/** * 不支援XML資料解析 */- (void)getXML {//1.管理器AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];//2.設定返回資料類型manager.responseSerializer = [AFXMLParserResponseSerializer serializer]; //先執行個體化一下//3.發起請求[manager GET:@"http://localhost/videos.xml" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject);} failure: ^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error);}];}- (void)getPlist {//1.管理器AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];//2.設定response類型manager.responseSerializer = [AFPropertyListResponseSerializer serializer]; //是Response, 別寫成request了. 修改為plist類型.manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; //這個可以直接往架構裡面修改.//3.請求[manager GET:@"http://localhost/videos.plist" parameters:nil success: ^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"%@", responseObject);} failure: ^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error);}];}
用AFN來POST JSON資料,上傳、下載等:
#pragma mark - post json資料與上傳檔案等- (void)postJSON {//1.管理器AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];//2.設定類型. (這裡要設定request-response的類型)manager.requestSerializer = [AFJSONRequestSerializer serializer];manager.responseSerializer = [AFHTTPResponseSerializer serializer]; //這個決定了下面responseObject返回的類型// manager.responseSerializer = [AFJSONResponseSerializer serializer];//manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"]; //2.設定登入參數NSDictionary *dict = @{ @"username":@"xn", @"password":@"123" };//3.發送請求[manager POST:@"http://localhost/postjson.php" parameters:dict success: ^(AFHTTPRequestOperation *operation, id responseObject) {// NSLog(@"postjson--> %@", responseObject); //這樣顯示JSON的話需要設定text/plain NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; NSLog(@"%@",result);} failure: ^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"%@", error);}];}
iOS開發之AFNetworking