iOS开发——网络请求案例汇总(AFNetworking)

    我在之前一篇博客中实现了使用NSURLConnection或者NSURLSession来请求网络数据,用的都是苹果自带的方法。请参考《iOS开发——网络请求案例汇总》。现在我们使用最流行的AFNetworking库来进行网络请求。代码我已经上传至https://github.com/chenyufeng1991/iOS-NetworkRequest 

【1.AFNetworking请求SOAP】

      SOAP一般需要我们发送XML数据,返回的一般也是XML数据。我这里用的也是http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx   。这个网站的手机号码归属地查询。不过经过我测试,时间延迟会比较长。。实现方式如下:

#import "AFNsoapViewController.h"
#import <AFNetworking.h>

@interface AFNsoapViewController ()

@end

@implementation AFNsoapViewController

- (void)viewDidLoad {
    [super viewDidLoad];

  // 创建SOAP消息,内容格式就是网站上提示的请求报文的主体实体部分    这里使用了SOAP1.2;
  NSString *soapMsg = [NSString stringWithFormat:
                       @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"
                       "<soap12:Envelope "
                       "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
                       "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" "
                       "xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">"
                       "<soap12:Body>"
                       "<getMobileCodeInfo xmlns=\"http://WebXml.com.cn/\">"
                       "<mobileCode>%@</mobileCode>"
                       "<userID>%@</userID>"
                       "</getMobileCodeInfo>"
                       "</soap12:Body>"
                       "</soap12:Envelope>", @"18888888888", @""];
  
  NSURL *url = [NSURL URLWithString: @"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx"];
  NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
  NSString *msgLength = [NSString stringWithFormat:@"%lu", (unsigned long)[soapMsg length]];
  [req addValue:@"application/soap+xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
  [req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
  [req setHTTPMethod:@"POST"];
  [req setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];
  
  AFHTTPRequestOperation *operate = [[AFHTTPRequestOperation alloc] initWithRequest:req];
  operate.responseSerializer = [AFHTTPResponseSerializer serializer];
  [operate setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
    
    
    NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    
    NSLog(@"成功:%@",result);
    
  } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
    NSLog(@"成功:%@",error);
  }];
  
  [operate start];
  
}


@end

打印结果如下:



【2.AFHTTPRequestOperationManager请求Http

这里直接用一个链接请求服务器数据,可以使用GET或者POST请求。参数直接写入到链接中。实现方式如下:

#import "AFNHttp1ViewController.h"
#import <AFNetworking.h>

@interface AFNHttp1ViewController ()

@end

@implementation AFNHttp1ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  
  
  //这里改成POST,就可以进行POST请求;
  //把要传递的参数直接放到URL中;而不是放到字典中;
  [manager GET:@"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=18888888888&userId="
    parameters:nil
       success:^(AFHTTPRequestOperation *operation,id responseObject){
         NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
         NSLog(@"成功: %@", string);
       }
       failure:^(AFHTTPRequestOperation *operation,NSError *error){
         NSLog(@"失败: %@", error);
       }];

}


@end




【3.AFHTTPRequestOperationManager请求Http改进版

在2的例子中,我们把参数放到了请求的链接中,并不是特别的方便,这里我们使用字典来存放需要发送的数据。实现如下:

#import "AFNHttp2ViewController.h"
#import <AFNetworking.h>

@interface AFNHttp2ViewController ()

@end

@implementation AFNHttp2ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

  
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  
  
  NSDictionary *dic = @{@"mobileCode":@"18888888888",
                        @"userID":@""};
  //这里改成POST,就可以进行POST请求;
  [manager GET:@"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo"
    parameters:dic
       success:^(AFHTTPRequestOperation *operation,id responseObject){
         NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
         NSLog(@"成功: %@", string);
       }
       failure:^(AFHTTPRequestOperation *operation,NSError *error){
         NSLog(@"失败: %@", error);
       }];

}


@end
打印结果与2一样。

【4.AFHTTPRequestOperation请求Http

在3的例子中,我们通过发送参数列表和链接地址来进行网络请求。现在我们设置一个Request,把这些数据都放到request参数中,然后通过只发送一个request来实现。

#import "AFNHttp3ViewController.h"
#import <AFNetworking.h>

@interface AFNHttp3ViewController ()

@end

@implementation AFNHttp3ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  
  
  NSURL *url = [NSURL URLWithString: @"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx/getMobileCodeInfo?mobileCode=18888888888&userId="];
  NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
  [req setHTTPMethod:@"GET"];
  
  
  AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:req];
  operation.responseSerializer = [AFHTTPResponseSerializer serializer];
  [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation * _Nonnull operation, id  _Nonnull responseObject) {
    
    NSString *result = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    
    NSLog(@"成功:%@",result);
    
  } failure:^(AFHTTPRequestOperation * _Nonnull operation, NSError * _Nonnull error) {
    NSLog(@"失败:%@",error);
    
  }];
  
  [operation start];
  
}


@end


打印结果与2一样。


【5.AFnetworking发送XML进行Http请求】

这种方式平时不多见,这里把“***”作为字典中的键,把XML作为字典中的值进行发送。并且还要进行安全性的设置。实现代码如下:

#import "AFNXMLHttpViewController.h"
#import <AFNetworking.h>

@interface AFNXMLHttpViewController ()

@end

@implementation AFNXMLHttpViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  
  /*
   这里需要进行如下的安全性设置;
   使用AFNetworking发送XML,如果不进行如下的设置,将会报错:
   Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.}
   */
  AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
  [securityPolicy setAllowInvalidCertificates:YES];
  
  AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  [manager setSecurityPolicy:securityPolicy];
  manager.responseSerializer = [AFHTTPResponseSerializer serializer];
  
  NSString *str = @"这里存放需要发送的XML";
  
  NSDictionary *parameters = @{@"test" : str};//test是这个XML对应的名字
  
  [manager POST:@"需要发送的链接"
     parameters:parameters
        success:^(AFHTTPRequestOperation *operation,id responseObject){
          NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
          NSLog(@"成功: %@", string);
        }
        failure:^(AFHTTPRequestOperation *operation,NSError *error){
          NSLog(@"失败: %@", error);
        }];
  
}


@end


     总结,使用AFNetworking进行网络请求还是比较简单的,我会继续深入的研究AFNetworking,有任何成果都会分享给大家。


最近开源的iOS应用,高仿印象笔记  https://github.com/chenyufeng1991/iOS-Oncenote 。欢迎大家点赞并关注项目进度。也可以安装到手机上试玩哦。

github主页:https://github.com/chenyufeng1991  。欢迎大家访问!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值