iOS AFNetWorking 请求JSON / XML 数据

    这是一个使用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);
}


转载于:https://my.oschina.net/u/1993356/blog/349891

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值