您的位置:首页 > 移动开发 > IOS开发

iOS AFNetWorking 请求JSON / XML 数据

2014-11-28 00:00 274 查看
摘要: 之前使用的ASI很强大,但是都知道没有人更新了所以也渐渐被大伙放弃了,现在使用比较多的就是AFNetWorking 2.0 了,当然还有MK NetWorking用的相对少点。AF使用起来比较简单功能也很强大,所以抽空写了个比较实用的Demo...

这是一个使用AFNetWorking 请求JSON 和 XML 数据的demo,包括GET / POST 请求。对于后台的数据大多数使用的是JSON,因为JSON不论是可读性或者解析的方式都是很好的. 但是XML也还有很多公司使用,相对JSON就没那没好而已。这个demo只使用一个类方法,根据传入的参数来判断是XML还是JSON解析,方便使用。

先附上源码下载链接:http://pan.baidu.com/s/1i37nXPz

1、方法封装在FKL_DataService.h / FKL_DataService.m 中

>1 FKL_DataService.h

/**
*  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 方法实现具体代码说明

主要使用 AFHttpRequestOperationManager 这个类,创建该类

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];


根据参数format 判断请求的数据是XML 还是 JSON,并且设置解析方法

// 数据类型转为大写,防止大小写混乱的参数
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就可以了

#define BaseURL @"http://www.raywenderlich.com


// 拼接完整的URL
NSString *intactURL = [BaseURL stringByAppendingString:url];


根据参数 type 判断是GET 还是 POST 请求
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);
}];
}


2、到此整个封装代码完成,还是挺简单的。后面需要用调用这个类方法就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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐