iOS:网络编程解析协议一:HTTP超文本传输协议
2015-09-24 13:15
591 查看
HTTP传输数据有四种方式:Get方式、Post方式、同步请求方式、异步请求方式。具体的介绍,前面已经有过系统的讲解,这次主要进行具体的举。
说明:同步和异步请求方式在创建链接对象和创建请求对象时,用Get方式或Post方式中的任意一种即可;那么,同步/异步请求方式和Get/Post方式不同的地方是什么呢?区别在于进行连接处理这一步上,Get/Post方式它们均使用相同代理NSURLConnectionDataDelegate的方法传输数据,而同步/异步请求方式则不需要使用代理。
前提:需要先在本机上搭建一个本地服务器,然后配合一个数据库创建一个数据库表,存放用户登录名和登陆密码,并且可以成功登陆即可。这个配置搭建我就不做解释了,可以自己查资料,以下是我搭建的本机服务器截图,可以登陆成功。
然后布局故事板,添加登陆文本框和按钮(并将它们IBOutlet到控制器类中)截图如下:
具体的代码如下:
导入头文件并设置相关属性
初始化:
按钮事件:
第1种方式:登陆服务器成功后,用Get方式解析服务器发送回来的数据,需要实现<NSURLConnectionDataDelegate>协议来解析
第2种方式:登陆服务器成功后,用Post方式解析服务器发送回来的数据,需要实现<NSURLConnectionDataDelegate>协议来解析
不论是Get方式,还是Post方式,都用到的一模一样的数据解析协议代理<NSURLConnectionDataDelegate>如下:
它们俩的运行结果都是:
第3种方式:登陆服务器成功后,用同步请求方式解析服务器发送回来的数据
运行结果:
第4种方式:登陆服务器成功后,用异步请求方式解析服务器发送回来的数据
运行结果:
说明:同步和异步请求方式在创建链接对象和创建请求对象时,用Get方式或Post方式中的任意一种即可;那么,同步/异步请求方式和Get/Post方式不同的地方是什么呢?区别在于进行连接处理这一步上,Get/Post方式它们均使用相同代理NSURLConnectionDataDelegate的方法传输数据,而同步/异步请求方式则不需要使用代理。
前提:需要先在本机上搭建一个本地服务器,然后配合一个数据库创建一个数据库表,存放用户登录名和登陆密码,并且可以成功登陆即可。这个配置搭建我就不做解释了,可以自己查资料,以下是我搭建的本机服务器截图,可以登陆成功。
然后布局故事板,添加登陆文本框和按钮(并将它们IBOutlet到控制器类中)截图如下:
具体的代码如下:
导入头文件并设置相关属性
@interface ViewController ()<NSURLConnectionDataDelegate> @property (weak, nonatomic) IBOutlet UITextField *userNameTextField; @property (weak, nonatomic) IBOutlet UITextField *passwordTextField; @property (strong,nonatomic)NSMutableData *allDatas;
初始化:
//给allDatas设置一个懒加载的方法 -(NSMutableData*)allDatas { if(!_allDatas) { _allDatas = [NSMutableData data]; } return _allDatas; }
按钮事件:
- (IBAction)loginButtonClicked:(UIButton *)sender { [self loginByGet]; //Get方式 [self loginByPost]; //Post方式 [self loginBySynchronous]; //同步请求方式 [self loginByAsynchronous];//异步请求方式 }
第1种方式:登陆服务器成功后,用Get方式解析服务器发送回来的数据,需要实现<NSURLConnectionDataDelegate>协议来解析
#pragma mark -用Get方法登陆 -(void)loginByGet { //1.创建NSURL对象,设置链接的地址 NSString *strURL = [NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //3.创建NSURLConnection连接对象 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; //4.向服务器发送请求 [connection start]; }
第2种方式:登陆服务器成功后,用Post方式解析服务器发送回来的数据,需要实现<NSURLConnectionDataDelegate>协议来解析
1 #pragma mark -用Post方式登陆 -(void)loginByPost { //1.创建NSURL对象,设置链接的地址 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setTimeoutInterval:5.0];//设置超时时间 [request setHTTPMethod:@"post"]; //设置post带的数据 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; NSData *datatBody = [strBody dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:datatBody]; //3.创建NSURLConnection连接对象 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; //4.向服务器发送请求 [connection start]; }
不论是Get方式,还是Post方式,都用到的一模一样的数据解析协议代理<NSURLConnectionDataDelegate>如下:
#pragma mark -<NSURLConnectionDataDelagate> //收到服务器的数据,因为数据会分数据包,可能会调用多次 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { //将分包组合在一起 [self.allDatas appendData:data]; } //链接出错时的处理 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"链接出错:%@",error); } //数据传输完成,做最后的处理 -(void)connectionDidFinishLoading:(NSURLConnection *)connection { unsigned long enconding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); NSString *strResponse = [[NSString alloc]initWithData:self.allDatas encoding:enconding]; NSLog(@"%@",strResponse); //清理数据 NSData *data = [@"" dataUsingEncoding:NSUTF8StringEncoding]; [self.allDatas setData:data]; } //post传输数据时返回数据传输的进度 -(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite { NSLog(@"bytes:%ld,totalBytes:%ld,totalBytesExpected:%ld",bytesWritten,totalBytesWritten,totalBytesExpectedToWrite); }
它们俩的运行结果都是:
2015-09-24 12:58:45.053 01-NSURLConnection[1608:80089] admin123456<br /> <b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b>30</b><br /> admin 欢迎你!进入 <a href="my.php">用户中心</a><br />点击此处 <a href="login.php?action=logout">注销</a> 登录!<br />
第3种方式:登陆服务器成功后,用同步请求方式解析服务器发送回来的数据
#pragma mark -同步请求(创建URL对象和请求对象时,Get和Post的方法都可以使用) -(void)loginBySynchronous { //1.创建NSURL对象,设置链接的地址 NSString *strURL = [NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setTimeoutInterval:1.0]; //3.使用同步请求 NSError *error = nil; NSURLResponse *response = nil; NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; if(error) { NSLog(@"数据传输错误:%@",error); } else { unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); NSString *str = [[NSString alloc]initWithData:data encoding:encoding]; NSLog(@"%@",str); } }
运行结果:
2015-09-24 13:11:15.010 01-NSURLConnection[1630:83994] admin123456<br /> <b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b>30</b><br /> admin 欢迎你!进入 <a href="my.php">用户中心</a><br />点击此处 <a href="login.php?action=logout">注销</a> 登录!<br />
第4种方式:登陆服务器成功后,用异步请求方式解析服务器发送回来的数据
#pragma mark -异步请求(创建URL对象和请求对象时,Get和Post的方法都可以使用) -(void)loginByAsynchronous { //1.创建NSURL对象,设置链接的地址 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; NSURL *url = [NSURL URLWithString:strURL]; //2.创建NSURLRequest请求对象 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"post"]; NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding]; [request setHTTPBody:dataBody]; //3.异步请求 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if(connectionError) { NSLog(@"数据获取失败:%@",connectionError); } else { unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); NSString *str = [[NSString alloc]initWithData:data encoding:encoding]; NSLog(@"async:%@",str); } }]; }
运行结果:
2015-09-24 13:13:32.407 01-NSURLConnection[1653:85054] async:admin123456<br /> <b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b>30</b><br /> admin 欢迎你!进入 <a href="my.php">用户中心</a><br />点击此处 <a href="login.php?action=logout">注销</a> 登录!<br />
相关文章推荐
- 图解TCP:socket bind listen syn ack 内核实现
- 一只简单的网络爬虫(基于linux C/C++)————主事件流程
- HttpURLConnection访问Webapi代码
- 一只简单的网络爬虫(基于linux C/C++)————利用正则表达式解析页面
- TCP协议疑难杂症全景解析
- 在美做开发多年,写给国内iphone新手,转自http://bbs.feng.com/read-htm-tid-768284.html
- 三类保留地址(私有地址)
- HttpClient 接口测试遇到的问题及解决方案
- http状态码
- http图片上传安全性问题 根据ContentType (MIME) 判断其实不准确、不安全
- Java网络通信之HttpClient
- HttpClient使用时遇到几个隐蔽小坑分析
- nagios 报警:HTTP WARNING: HTTP/1.1 403 Forbidden - 5240 bytes in 0.001 second response time
- TCP/IP 协议详解内容总结
- iOS UITableView 网络请求刷新 搜索
- Nginx 的 TCP 负载均衡介绍
- HTTP请求中文等出现乱码解决方案
- HTTP协议详解
- HttpClient多线程调用并返回值
- java学习笔记网络编程