iOS:网络编程解析协议一:HTTP超文本传输协议
HTTP传输数据有四种方式:Get方式、Post方式、同步请求方式、异步请求方式。具体的介绍,前面已经有过系统的讲解,这次主要进行具体的举。
说明:同步和异步请求方式在创建链接对象和创建请求对象时,用Get方式或Post方式中的任意一种即可;那么,同步/异步请求方式和Get/Post方式不同的地方是什么呢?区别在于进行连接处理这一步上,Get/Post方式它们均使用相同代理NSURLConnectionDataDelegate的方法传输数据,而同步/异步请求方式则不需要使用代理。
前提:需要先在本机上搭建一个本地服务器,然后配合一个数据库创建一个数据库表,存放用户登录名和登陆密码,并且可以成功登陆即可。这个配置搭建我就不做解释了,可以自己查资料,以下是我搭建的本机服务器截图,可以登陆成功。
然后布局故事板,添加登陆文本框和按钮(并将它们IBOutlet到控制器类中)截图如下:
具体的代码如下:
导入头文件并设置相关属性
1 @interface ViewController ()<NSURLConnectionDataDelegate> 2 @property (weak, nonatomic) IBOutlet UITextField *userNameTextField; 3 @property (weak, nonatomic) IBOutlet UITextField *passwordTextField; 4 @property (strong,nonatomic)NSMutableData *allDatas;
初始化:
1 //给allDatas设置一个懒加载的方法 2 -(NSMutableData*)allDatas 3 { 4 if(!_allDatas) 5 { 6 _allDatas = [NSMutableData data]; 7 } 8 return _allDatas; 9 }
按钮事件:
1 - (IBAction)loginButtonClicked:(UIButton *)sender 2 3 { 4 5 [self loginByGet]; //Get方式 6 7 [self loginByPost]; //Post方式 8 9 [self loginBySynchronous]; //同步请求方式 10 11 [self loginByAsynchronous];//异步请求方式 12 13 }
第1种方式:登陆服务器成功后,用Get方式解析服务器发送回来的数据,需要实现<NSURLConnectionDataDelegate>协议来解析
1 #pragma mark -用Get方法登陆 2 -(void)loginByGet 3 { 4 //1.创建NSURL对象,设置链接的地址 5 NSString *strURL = [NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 //2.创建NSURLRequest请求对象 9 NSURLRequest *request = [NSURLRequest requestWithURL:url]; 10 11 //3.创建NSURLConnection连接对象 12 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 13 14 //4.向服务器发送请求 15 [connection start]; 16 }
第2种方式:登陆服务器成功后,用Post方式解析服务器发送回来的数据,需要实现<NSURLConnectionDataDelegate>协议来解析
1 #pragma mark -用Post方式登陆 2 -(void)loginByPost 3 { 4 //1.创建NSURL对象,设置链接的地址 5 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 //2.创建NSURLRequest请求对象 9 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 10 [request setTimeoutInterval:5.0];//设置超时时间 11 [request setHTTPMethod:@"post"]; 12 13 //设置post带的数据 14 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 15 NSData *datatBody = [strBody dataUsingEncoding:NSUTF8StringEncoding]; 16 [request setHTTPBody:datatBody]; 17 18 //3.创建NSURLConnection连接对象 19 NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self]; 20 21 //4.向服务器发送请求 22 [connection start]; 23 24 }
不论是Get方式,还是Post方式,都用到的一模一样的数据解析协议代理<NSURLConnectionDataDelegate>如下:
1 #pragma mark -<NSURLConnectionDataDelagate> 2 //收到服务器的数据,因为数据会分数据包,可能会调用多次 3 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 4 { 5 //将分包组合在一起 6 [self.allDatas appendData:data]; 7 } 8 9 //链接出错时的处理 10 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 11 { 12 NSLog(@"链接出错:%@",error); 13 } 14 15 //数据传输完成,做最后的处理 16 -(void)connectionDidFinishLoading:(NSURLConnection *)connection 17 { 18 unsigned long enconding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 19 20 NSString *strResponse = [[NSString alloc]initWithData:self.allDatas encoding:enconding]; 21 22 NSLog(@"%@",strResponse); 23 24 25 //清理数据 26 NSData *data = [@"" dataUsingEncoding:NSUTF8StringEncoding]; 27 [self.allDatas setData:data]; 28 } 29 30 //post传输数据时返回数据传输的进度 31 -(void)connection:(NSURLConnection *)connection didSendBodyData:(NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite 32 { 33 NSLog(@"bytes:%ld,totalBytes:%ld,totalBytesExpected:%ld",bytesWritten,totalBytesWritten,totalBytesExpectedToWrite); 34 }
它们俩的运行结果都是:
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种方式:登陆服务器成功后,用同步请求方式解析服务器发送回来的数据
1 #pragma mark -同步请求(创建URL对象和请求对象时,Get和Post的方法都可以使用) 2 -(void)loginBySynchronous 3 { 4 //1.创建NSURL对象,设置链接的地址 5 NSString *strURL = [NSString stringWithFormat:@"http://127.0.0.1/userManager/login.php?username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 //2.创建NSURLRequest请求对象 9 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 10 [request setTimeoutInterval:1.0]; 11 12 //3.使用同步请求 13 NSError *error = nil; 14 NSURLResponse *response = nil; 15 NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 16 if(error) 17 { 18 NSLog(@"数据传输错误:%@",error); 19 } 20 else 21 { 22 unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 23 24 NSString *str = [[NSString alloc]initWithData:data encoding:encoding]; 25 NSLog(@"%@",str); 26 } 27 }
运行结果:
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种方式:登陆服务器成功后,用异步请求方式解析服务器发送回来的数据
1 #pragma mark -异步请求(创建URL对象和请求对象时,Get和Post的方法都可以使用) 2 -(void)loginByAsynchronous 3 { 4 //1.创建NSURL对象,设置链接的地址 5 NSString *strURL = @"http://127.0.0.1/userManager/login.php"; 6 NSURL *url = [NSURL URLWithString:strURL]; 7 8 9 //2.创建NSURLRequest请求对象 10 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 11 [request setHTTPMethod:@"post"]; 12 NSString *strBody = [NSString stringWithFormat:@"submit=1&username=%@&password=%@",self.userNameTextField.text,self.passwordTextField.text]; 13 NSData *dataBody = [strBody dataUsingEncoding:NSUTF8StringEncoding]; 14 [request setHTTPBody:dataBody]; 15 16 17 //3.异步请求 18 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 19 if(connectionError) 20 { 21 NSLog(@"数据获取失败:%@",connectionError); 22 } 23 else 24 { 25 unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000); 26 NSString *str = [[NSString alloc]initWithData:data encoding:encoding]; 27 NSLog(@"async:%@",str); 28 } 29 }]; 30 }
运行结果:
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 />
转载于:https://www.cnblogs.com/XYQ-208910/p/4835014.html
iOS:网络编程解析协议一:HTTP超文本传输协议相关推荐
- 王道考研 计算机网络20 应用层 客户端/服务器C/S模型 P2P模型 DHCP协议 域名解析系统DNS 文件传送协议FTP 万维网 超文本传输协议HTTP
应用层概述 FTP:文件传输协议(File Transfer Protocol)是用于在网络上进行文件传输的一套标准协议. SMTP:是一种提供可靠且有效的电子邮件传输的协议. POP3 ,全名为&q ...
- Java 网络编程(二) 两类传输协议:TCP UDP
两类传输协议:TCP,UDP TCP TCP是Transfer Control Protocol(传输控制协议)的简称,是一种面向连接的保证可靠传输的协议. 在TCP/IP协议中, IP层主要负责网络 ...
- 互联网协议 — HTTP/2 超文本传输协议第 2 版
目录 文章目录 目录 SPDY 协议 HTTP/2 HTTP/2 对比 HTTP/1.1 HTTP/2 协议的基本概念 HTTP/2 的帧 HTTP/2 的头压缩 HTTP/2 的服务端推送 HTTP ...
- 互联网协议 — HTTP/3 超文本传输协议第 3 版
目录 文章目录 目录 HTTP/3 HTTP/3 与 HTTP/2 的比较 HTTP/3 的特性 零 RTT 建立连接 QUIC 流 HTTP/3 帧(frame) HTTP 请求 HTTP 响应 Q ...
- 超文本传输协议HTTP
在了解HTTP 协议之前需要先了解一些其他的概念,了解它们之间的关系才能更好的理解HTTP 协议. 内容偏于理论知识,理解起来可能不是很容易,所以在阅读之前希望带着以下几个问题,增加阅读的兴趣. 为什 ...
- iOS网络编程开发—HTTP协议
iOS网络编程开发-HTTP协议 说明:apache tomcat服务器必须占用8080端口 一.URL 1.基本介绍 URL的全称是Uniform Resource Locator(统一资源定位符) ...
- python中http协议编程_python网络编程、套接字、HTTP协议
网络编程 网络目的 : 数据的传输 网络数据传输是一个复杂的过程 OSI 七层模型 --> 网络通信标准化流程 应用层 : 提供用户服务,具体内容由特定程序规定 表示层 : 数据的压缩优化 会话 ...
- 网络编程之深入浅出,全面理解HTTP协议
网络编程之深入浅出,全面理解HTTP协议 前言 "HTTP之父"其人 HTTP概述 计算机网络体系结构分层 TCP/IP 通信传输流 HTTP 请求如下图所示: HTTP 工作过程 ...
- 《iOS网络编程与云端应用最佳实践》微博转发送书了!
<iOS网络编程与云端应用最佳实践>微博转发送书了! 新浪微博地址:http://weibo.com/2078101705/zy15U4a5D,转发本条微博即有机会获得<iOS网络编 ...
- 网络(7)-HTTP(HyperText Transfer Protocol,超文本传输协议)
http是一个简单的请求-响应协议,它通常运行在TCP之上.它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应.请求和响应消息的头以ASCII码形式给出:而消息内容则具有一个类似MIME的 ...
最新文章
- CentOS系统的优化
- Java布尔类的compareTo()
- 冒泡排序和鸡尾酒排序(改进的冒泡排序)
- VBA中访问Web Service
- String Stringbuilder StringBuffer的区别和应用
- 全网最通透的“闭包”认知 · 跨越语言
- 面试精讲之面试考点及大厂真题 - 分布式专栏 15 如何解决消息重复,保证消息顺序问题
- CSS的@media与@media screen,媒体查询
- 【英语学习】【WOTD】disavow 释义/词源/示例
- 前端开源项目周报0214
- Font Awesome 字体符号的使用
- 2022-2028全球二片罐行业调研及趋势分析报告
- Python · 助力冬奥:turtle绘制奥运五环
- 普通管理类程序开发之难度系数、层次之说法
- C#中Atan()与Atan2()
- 民营企业的十三种死法
- selenium + Chrome 滑动验证码破解三之京东 实现某东登录
- 用SCI论文求婚!网友这波高级狗粮我吃……
- Qt编写ERP库存库房发货电子看板
- 《弟子规》之余力学文
热门文章
- Linux 网络路由介绍
- 如何使用GIST+LIBLINEAR分类器提取CIFAR-10 dataset数据集中图像特征,并用测试数据进行实验
- 深入剖析Redis系列(三) - Redis集群模式搭建与原理详解
- p2657 windy数
- Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比 Spring配置文件生成约束的菜单方法...
- vue 中eslint 格式报错
- 我诞生了!祝贺我吧。
- 解除svn控制下的文件夹的svn的控制
- rocketMq - commitLog
- Spring《二》 Bean的生命周期