苹果自带API:Foundation——NSURLConnection

转自:文顶顶  点击打开链接   M了个J 点击打开链接

一、NSURLConnection的常用类

(1)NSURL:请求地址

(2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体....

(3)NSMutableURLRequest:NSURLRequest的子类

(4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据

二、NSURLConnection的使用

(1)创建一个NSURL对象,设置请求路径(设置请求路径)

(2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)

(3)使用NSURLConnection发送NSURLRequest(发送请求)




说明: 1、任何NSURLRequest默认都是get请求。由于是GET请求,请求参数是直接拼接到路径后面的。GET请求:请求行\请求头\请求体。注意:GET请求中不存在请求体, 因为所有的信息都写在URL里面。在IOS里面,请求行和请求头都不用写。
   2、调用NSURLConnection的start方法发送一个HTPP请求,默认就是异步请求。

1.利用NSURLConnection发送同步请求

 //
 //    1.设置请求路径
     NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
     NSURL *url=[NSURL URLWithString:urlStr];
 //    2.创建请求对象
     NSURLRequest *request=[NSURLRequest requestWithURL:url];
 //    3.发送请求
     //发送同步请求,在主线程执行
     NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
     //(一直在等待服务器返回数据,这行代码会卡住,如果服务器没有返回数据,那么在主线程UI会卡住不能继续执行操作)
     NSLog(@"--%d--",data.length);

2.利用NSURLConnection发送异步请求

发送异步请求有两种方式:
1)使用block回调
2)代理

A.使用block回调方法发送异步请求

//    1.设置请求路径
     NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
     NSURL *url=[NSURL URLWithString:urlStr];
     
 //    2.创建请求对象
     NSURLRequest *request=[NSURLRequest requestWithURL:url];
     
 //    3.发送请求
     //3.1发送同步请求,在主线程执行
 //    NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
     //(一直在等待服务器返回数据,这行代码会卡住,如果服务器没有返回数据,那么在主线程UI会卡住不能继续执行操作)
     
     //3.1发送异步请求
     //创建一个队列(默认添加到该队列中的任务异步执行)
 //    NSOperationQueue *queue=[[NSOperationQueue alloc]init];
     //获取一个主队列
     NSOperationQueue *queue=[NSOperationQueue mainQueue];
     [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
         NSLog(@"--block回调数据--%@---%d", [NSThread currentThread],data.length);
         //隐藏HUD,刷新UI的操作一定要放在主线程执行
         [MBProgressHUD hideHUD];
         
         //解析data
         /*
         {"success":"登录成功"}
         {"error":"用户名不存在"}
           {"error":"密码不正确"}
          */
	if (data){
         NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
         NSLog(@"%@",dict);
	}
}

说明:使用NSJSONSerialization 返回的对象,取决于最外层是什么,如果是{}那就是字典,[]那就是数组等。
补充说明:
首先确定请求路径,然后创建请求对象(默认发送的时get请求),使用异步方法(一调用这个方法,它会自动开启一个子线程去发送请求,当请求成功,数据返回的时候自动调用内部的代码段,这个代码段在那个线程执行取决于队列,如果是主队列,那么在子线程发送请求成功拿到服务器的数据后,回到主线程中解析数据,刷新UI界面)。

block代码段:当服务器有返回数据的时候调用会开一条新的线程去发送请求,主线程继续往下走,当拿到服务器的返回数据的数据的时候再回调block,执行block代码段 。这种情况不会卡住主线程。
队列的作用:决定这个block操作放在哪个线程执行?
刷新UI界面的操作应该放在主线程执行,不能放在子线程,在子线程处理UI相关操作会出现一些莫名的问题。
提示:
(1)创建一个操作,放在NSOperation队列中执行,默认是异步执行的。
(2)mainqueue   返回一个和主线程相关的队列,即主队列。

B.使用代理方法发送异步请求

要监听服务器返回的data,所以使用<NSURLConnectionDataDelegate>协议

 #pragma mark- NSURLConnectionDataDelegate代理方法
 
 //当接收到服务器的响应(连通了服务器)时会调用
 
 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
 
 //当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
 
 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
 
 //当服务器的数据加载完毕时就会调用
 
 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
 
 //请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)
 
 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error


 //
 37 //   2.1设置请求路径
 38     NSString *urlStr=[NSString stringWithFormat:@"http://192.168.1.53:8080/MJServer/login?username=%@&pwd=%@",self.username.text,self.pwd.text];
 39     NSURL *url=[NSURL URLWithString:urlStr];
 40     
 41 //   2.2创建请求对象
 42 //    NSURLRequest *request=[NSURLRequest requestWithURL:url];//默认就是GET请求
 43     //设置请求超时
 44     NSMutableURLRequest *request=[NSMutableURLRequest  requestWithURL:url];
 45     request.timeoutInterval=5.0;
 46     
 47 //   2.3.发送请求
 48  //使用代理发送异步请求(通常应用于文件下载)
 49     NSURLConnection *conn=[NSURLConnection connectionWithRequest:request delegate:self];
 50     [conn start];
 51     NSLog(@"已经发出请求---");
 52 }
 53 
 54 #pragma mark- NSURLConnectionDataDelegate代理方法
 55 /*
 56  *当接收到服务器的响应(连通了服务器)时会调用
 57  */
 58 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
 59 {
 60     NSLog(@"接收到服务器的响应");
 61     //初始化数据
 62     self.responseData=[NSMutableData data];
 63 }
 64 
 65 /*
 66 *当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)
 67 */
 68 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
 69 {
 70     NSLog(@"接收到服务器的数据");
 71     //拼接数据
 72     [self.responseData appendData:data];
 73         NSLog(@"%d---%@--",self.responseData.length,[NSThread currentThread]);
 74 }
 75 
 76 /*
 77  *当服务器的数据加载完毕时就会调用
 78  */
 79 -(void)connectionDidFinishLoading:(NSURLConnection *)connection
 80 {
 81     NSLog(@"服务器的数据加载完毕");
 82     //隐藏HUD
 83     [MBProgressHUD hideHUD];
 84     
 85     //处理服务器返回的所有数据
 86     NSDictionary *dict=[NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil];
 87     
 88     //判断后,在界面提示登录信息
 89     NSString *error=dict[@"error"];
 90     if (error) {
 91         [MBProgressHUD showError:error];
 92     }else
 93     {
 94         NSString *success=dict[@"success"];
 95         [MBProgressHUD showSuccess:success];
 96     }
 97     NSLog(@"%d---%@--",self.responseData.length,[NSThread currentThread]);
 98 }
 99 /*
100  *请求错误(失败)的时候调用(请求超时\断网\没有网\,一般指客户端错误)
101  */
102 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
103 {
104 //     NSLog(@"请求错误");
105     //隐藏HUD
106     [MBProgressHUD hideHUD];
107     [MBProgressHUD showError:@"网络繁忙,请稍后重试!"];
108 }
109 @end


三、NSMutableURLRequest

NSMutableURLRequest是NSURLRequest的子类常用方法

设置请求超时等待时间(超过这个时间就算超时,请求失败)- (void)setTimeoutInterval:(NSTimeInterval)seconds;

设置请求方法(比如GET和POST)- (void)setHTTPMethod:(NSString *)method;

设置请求体- (void)setHTTPBody:(NSData *)data;

设置请求头- (void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)field;

四、对中文参数进行编码

 // 使用UTF-8对中文参数进行编码
 NSString *param = [@"母鸡" stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
 
 // 请求地址
 NSString *baseUrl = @"http://192.168.1.102:8080/MJServer/login?username=";
 NSString *urlString = [baseUrl stringByAppendingString:param];

五、异步POST请求

假如请求路径是http://192.168.1.102:8080/MJServer/login,请求参数有2个:

  • username :母鸡
  • pwd :123

1.POST请求细节分析

要想在iOS中发送一个POST请求,首先要了解POST请求的一些细节:

1> 跟GET请求不一样的是,POST请求的请求参数不是拼接在请求路径后面,而是以请求体的形式发送到服务器端。

2> POST请求需要发送两部分的数据到服务器端:

请求体内容:所有的请求参数

username=%E6%AF%8D%E9%B8%A1&pwd=123

中文参数需要进行编码,参数"母鸡"被编码成"%E6%AF%8D%E9%B8%A1"

请求头信息:请求体长度、请求数据的类型

Content-Length是指请求体长度,Content-Type是指请求数据类型

1 // 请求地址
 2 NSString *urlString = @"http://192.168.1.102:8080/MJServer/login";
 3 // 初始化一个NSURL对象
 4 NSURL *url = [NSURL URLWithString:urlString];
 5 
 6 // 初始化一个请求
 7 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 8 // 设置请求方法
 9 request.HTTPMethod = @"POST";
10 // 60秒请求超时
11 request.timeoutInterval = 60;
12 
13 // 拼接请求参数
14 NSString *params = @"username=母鸡&pwd=123";
15 // 对字符串进行编码后转成NSData对象
16 NSData *data = [params dataUsingEncoding:NSUTF8StringEncoding];
17 // 设置请求体
18 request.HTTPBody = data;
19 
20 // 设置请求头信息-请求体长度
21 NSString *contentLength = [NSString stringWithFormat:@"%i", data.length];
22 [request setValue:contentLength forHTTPHeaderField:@"Content-Length"];
23 // 设置请求头信息-请求数据类型
24 [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
25 
26 // 初始化一个连接
27 NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
28 // 开始一个异步请求
29 [conn start];


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值