一、NSURLConnection的常用类
(1)NSURL:请求地址
(2)NSURLRequest:封装一个请求,保存发给服务器的全部数据,包括一个NSURL对象,请求方法、请求头、请求体....
(3)NSMutableURLRequest:NSURLRequest的子类
(4)NSURLConnection:负责发送请求,建立客户端和服务器的连接。发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据
二、NSURLConnection的使用
(1)创建一个NSURL对象,设置请求路径(设置请求路径)
(2)传入NSURL创建一个NSURLRequest对象,设置请求头和请求体(创建请求对象)
(3)使用NSURLConnection发送NSURLRequest(发送请求)
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发送异步请求
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);
}
}
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];