這是一個使用AFNetWorking 請求JSON 和 XML 數據的demo,包括GET / POST 請求。對於後臺的數據大多數使用的是JSON,由於JSON不管是可讀性或者解析的方式都是很好的. 可是XML也還有不少公司使用,相對JSON就沒那沒好而已。這個demo只使用一個類方法,根據傳入的參數來判斷是XML仍是JSON解析,方便使用。 php
先附上源碼下載連接:http://pan.baidu.com/s/1i37nXPzjava
一、方法封裝在FKL_DataService.h / FKL_DataService.m 中 網絡
>1 FKL_DataService.h url
/** * AFNetWorking 網絡請求 * * @param url 請求地址 * @param pareames 參數 * @param type 請求方式(POST / GET) * @param format 請求的數據是xml 仍是 JSON * @param complete 請求完成後回調的block * * @return AFHTTPRequestOperation */ +(AFHTTPRequestOperation *)requestURL:(NSString *)url parameters:(NSDictionary *)pareames withType:(NSString *)type format:(NSString *)xmlOrJson complete:(CompleteBlock)block ;
>2 FKL_DataService.m 方法實現具體代碼說明
spa
主要使用 AFHttpRequestOperationManager 這個類,建立該類 code
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
根據參數format 判斷請求的數據是XML 仍是 JSON,而且設置解析方法orm
// 數據類型轉爲大寫,防止大小寫混亂的參數 NSString *str = [xmlOrJson uppercaseString]; if ([str isEqualToString:@"JSON"]) { // 設置解析方式 manager.responseSerializer = [AFJSONResponseSerializer serializer];(默認是JSON解析) } else if ([str isEqualToString:@"XML"]){ // AFHTTPResponseSerializer不使用解析,即返回的爲NSData類型數據,若是使用AFXMLParserResponseSerializer 解析會比較麻煩,因此會在後面使用第三方的XML解析(XMLReader) manager.responseSerializer = [AFHTTPResponseSerializer serializer]; }
拼接URL ,由於數據請求都會有一個主URL和其餘的子URL,便於方便靈活使用在這裏定義一個BaseURL,每次只要參數子URL就能夠了xml
#define BaseURL @"http://www.raywenderlich.com
// 拼接完整的URL NSString *intactURL = [BaseURL stringByAppendingString:url];
根據參數 type 判斷是GET 仍是 POST 請求get
GET 請求 源碼
// 請求方式 NSString *typeStr = [type uppercaseString]; // 防止參數大小寫混亂 if ([typeStr isEqualToString:@"GET"]) { [manager GET:intactURL parameters:pareames success:^(AFHTTPRequestOperation *operation, id responseObject) { if ([str isEqualToString:@"XML"]) { NSString *xmlString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; // 使用XMLReader,將xml數據解析爲字典格式(請看XMLReader類中的方法) NSError *error = nil; NSDictionary *xmlDic = [XMLReader dictionaryForXMLString:xmlString error:&error]; // 請求數據成功後回調 block(xmlDic); } else { //默認是JSON解析,responseObject 就是解析後的字典不須要本身再作解析 block(responseObject); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"請求數據失敗:%@!",error); }];
POST請求
else if([typeStr isEqualToString:@"POST"]){ [manager POST:intactURL parameters:pareames success:^(AFHTTPRequestOperation *operation, id responseObject) { if ([str isEqualToString:@"XML"]) { NSString *xmlString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]; // 將xml數據轉換爲字典 NSError *error = nil; NSDictionary *xmlDic = [XMLReader dictionaryForXMLString:xmlString error:&error]; block(xmlDic); // NSLog(@"XML數據請求成功:%@",xmlString); } else { block(responseObject); // NSLog(@"JSON數據請求成功:%@",responseObject); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"數據請求失敗%@",error); }]; }
二、到此整個封裝代碼完成,仍是挺簡單的。後面須要用調用這個類方法就OK了,仍是很方便的
viewController.m 中調用
子URL
#define subURL @"/demos/weather_sample/weather.php?"
- (void)_loadData { // 須要傳入的請求參數,用字典保存 NSMutableDictionary *perame = [NSMutableDictionary dictionary]; [perame setObject:@"xml" forKey:@"format"]; // 直接調用類方法 [FKL_DataService requestURL:subURL parameters:perame withType:@"POST" format:@"XML" complete:^(id result) { [self showReponsData:result]; }]; } // 解析後的數據使用 - (void)showReponsData:(NSDictionary *)result { NSLog(@"返回數據:%@",result); }