IOS网络基础之NSURL,NSRequest,NSConnection

IOS网络编程层次模型
     Cocoa层:NSURL,Bonjour,GameKit,WebKit
     Core Foundation层:基于C的CFNetwork和CFNetService
     OS层:基于C的BSD socket
     本文要讨论的是NSURL部分。

GET和POST
     GET和POST是网络请求的两种最常用方式。简单而言GET方式的网络请求服务器只会接收到一个包含或者不包含信息的URL链接。而POST方式的网络请求,通常会向服务器发送一个数据体。这两种方式的所有特性都是基于其这两个特点而产生的。

IOS的GET方式网络请求
     步骤:
          1、确定NSURL资源
          2、创建NSURLRequest网络请求
          3、创建NSURLConnection连接请求
          4、启动连接

     代码:

    //格式化请求的ULR链接,以及包含要发送的数据到URL链接
    NSString *urlStr = [NSString stringWithFormat:@"http://www.baidu.com"];
    //对包含中文的ULR链接进行UTF-8重新编码
    urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    //将字符串转换为URL资源
    NSURL *url = [NSURL URLWithString:urlStr];
    //创建请求
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    //创建连接
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    //启动连接
    [conn start];
完成GET方式的网络请求,我们可以用NSURLConnection的代理方法处理服务器响应。
     步骤:
          1、遵循NSURLConnection代理协议
          2、实现代理方法
          3、创建一个可变NSData拼接服务器返回的NSData
          4、重写代理方法
     代码:

#pragma mark NSURLConnection代理方法
#pragma mark 1. 准备接收服务器响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSLog(@"服务器响应:%@", response);
}

#pragma mark 2. 接收服务器传输的数据,可能会多次执行
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // 对每次传输的数据进行拼接
    [self.resData appendData:data];
}

#pragma mark 3. 接收数据完成,做后续处理
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // 处理数据,将NSData转化为NSString
    NSString *str = [[NSString alloc]initWithData:self.resData encoding:NSUTF8StringEncoding];
    // 处理数据,这里只在控制台输出信息
    NSLog(@"服务器返回数据:%@",str);
    // 清空数据
    self.resData = nil;
}

#pragma mark 4. 服务器请求失败
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"网络请求错误:%@", error.localizedDescription);
}
IOS的POST方式网络请求
     步骤:
          1、确定NSURL资源
          2、创建NSURLRequest网络请求
          3、创建数据体,并向数据体封装数据
          4、创建NSURLConnection连接请求
          5、启动连接 
     代码:

//确定NSURL资源
    NSString *urlString = [NSString stringWithFormat:@"http://www.baidu.com"];
    NSURL *url = [NSURL URLWithString:urlString];
    
    //建立NSURLRequest(POST)请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    
    //1) 设置请求方式
    [request setHTTPMethod:@"POST"];
    
    //2) 创建数据体,并向数据体内封装数据(POST请求中创建数据体时,如果有中文,不需要转换,因为dataUsingEncoding已经实现了转码)
    NSString *cards = @"AAA";
    NSString *names = @"XXX";
    NSString *bodyStr = [NSString stringWithFormat:@"封装数据一:%@&封装数据二:%@", cards, names];
    //将NSString转换为NSData
    NSData *body = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
    
    [request setHTTPBody:body];
    
    //建立NSURLConnection连接
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    //启动连接
    [conn start];
    
    //实例化NSData准备从服务器接收数据
    self.resData = [NSMutableData data];

NSURLConnection同步与异步请求
NSURLConnection还提供另外两种网络请求方式,一种是同步请求,一种是异步请求。用于不同的网络访问情况。
  这两个方法分别是sendAsynchronousRequest和sendSynchronousRequest。
  这里给出异步请求的代码:

    // 异步请求
    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *reponse, NSData *data, NSError *error) {
        
        if (data != nil) {
            NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"服务器返回的数据为:%@", str);
        } else if (data == nil && error == nil) {
            NSLog(@"服务器返回数据为空");
        } else {
            NSLog(@"服务器连接错误,错误信息:%@", error.localizedDescription);
        }
    }];
关于这两个方法的详细使用可以参见IOS网络基础之JSON。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值