IOS中的网络编程详解

  在移动互联网时代,几乎所有应用都需要用到网络,比如QQ、微博、网易新闻、优酷、百度地图,只有通过网络跟外界进行数据交互、数据更新,应用才能保持新鲜、活力,如果没有了网络,也就缺少了数据变化,无论外观多么华丽,终将变成一潭死水。下面我们尝试一下如何进行网络请求

  http编程其实就是http请求。http请求最长用的方法是 get 和 post 方法。

  1>get方法和post方法相比理解起来比较简单,get方法可以直接请求一个url,也可以url后面拼接上参数作为一个新的url地址进行请求。get方法后面的value要经过unicode编码。form的enctype属性默认为application/x-www-form-urlencoded。不能发送二进制文件。
  2>post方法相对要复杂一些。首先post方法要设置key和value ,所有的key和value都会拼接成 key1=value1&key2=value2的样式的字符串,然后这个字符串转化为二进制放到 http请求的body中。当请求发送的时候,也就跟随body一起传给服务器。http请求Content-Type设置为:application/x-www-form-urlencoded。这里讲的只是简单的post请求,一般发送文件不会选择这种方式(从技术方面考虑也可以发送文件,就是把文件以 key 和 value的方式放入)。下面我们再讨论一下post发送二进制文件更加普遍的方法

 

1、发送请求

- (void)viewDidLoad {
 
    //创建一个链接,别切拼接需要传递的参数,由于服务器为本地搭建,接受两个参数一个是用户名,一个是用户密码,因此我这里传递两个参数过去,默认的是Get方式
    NSURL * url=[NSURL URLWithString:@"http://192.168.0.111/logo.php?userName=jereh&pwd=123"];
 
    //根据练级e
    NSMutableURLRequest  * request=[NSMutableURLRequest requestWithURL:url];
 
    //链接网络并发送请求
    [NSURLConnection connectionWithRequest:request delegate:self];
    
    
}

2、接受返回的数据

网络请求后我们需要接受返回的数据,这里我们需要实现代理方法来接受返回数据,这里我们需要实现协议,并定义一个可变的NSData对象

以下几个代理方法是经常用到的

#pragma mark - NSURLConnectionDataDelegate

#pragma mark 刚接收到服务器响应的时候调用
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    self.data=[NSMutableData data];
    NSLog(@"开始响应");
}
#pragma mark 开始接收服务器传递数据的时候调用,由于当传递的数据很大的时候,系统会分多次接受,因此我们需要定义一个可变的二进制对象来保存每次请求的数据
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    NSLog(@"开始接收数据");
    [self.data appendData:data];
}
#pragma mark 结束接收服务器数据的时候调用
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    
    NSString * str=[[NSString alloc] initWithData:self.data encoding:NSUTF8StringEncoding];
    NSLog(@"%@",str);
}

#pragma mark 接受数据出错的时候调用
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    NSLog(@"请求出错");

}

3、POST方法请求

上面我们采用的get方法,如果我们采用POST方法如何请求呢,只需要将不可变的请求变为可变的请求然后设置方法即可

- (void)viewDidLoad {

        //创建一个请求
    NSURL * url=[NSURL URLWithString:@"http://192.168.0.111/logo.php?userName=jereh&pwd=123"];
    
    NSMutableURLRequest  * request=[NSMutableURLRequest requestWithURL:url];
    //设置方法
    request.HTTPMethod=@"POST";
    
    //设置参数
    NSString * param=@"userName=jereh&&pwd=123";
    NSData * data=[param dataUsingEncoding:NSUTF8StringEncoding];
    
    //设置请求体
    request.HTTPBody=data;
    
    //链接网络并发送请求
    [NSURLConnection connectionWithRequest:request delegate:self];
    
    
}

4 同步方式发送请求

另外我们才发送请求的时候也可以采用同步方式的方式,如果我们在网络请求的时候需要等待网络请求结束在执行某个操作,我们可以采取同步请求

NSData * data= [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

5 block形式异步请求

另外在发送异步请求的时候,我们也可以采取block的形式,如下

NSOperationQueue * queue=[NSOperationQueue mainQueue];
    
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    
    NSString * str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}];

 

作者:杰瑞教育
出处: http://www.cnblogs.com/jerehedu/ 
版权声明:本文版权归 杰瑞教育 技有限公司和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
技术咨询:JRedu技术交流
 

转载于:https://www.cnblogs.com/jerehedu/p/4961681.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值