iOS:网络编程解析协议一:HTTP超文本传输协议

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介:

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 />

 

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!


本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4835014.html,如需转载请自行联系原作者
目录
打赏
0
0
0
0
51
分享
相关文章
深度解析Recraft V3:突破文本渲染限制,文生图黑马是怎样炼成的?
Recraft V3模型在文本生成图像(Text-to-Image)领域取得重大突破,通过创新的&quot;Bridging Text Spotting&quot;方法,解决了传统方法中误差累积和性能不佳的问题。该模型采用独立训练的检测器和识别器,并引入Bridge和Adapter机制,确保高质量图像生成。Recraft V3在多个数据集上表现优异,如Total-Text准确率达83.3%,ICDAR 2015达89.5%。其应用前景广泛,涵盖广告设计、教育和娱乐等领域,为文生图技术的实际应用提供了新可能。
156 27
基于qwen2.5的长文本解析、数据预测与趋势分析、代码生成能力赋能esg报告分析
Qwen2.5是一款强大的生成式预训练语言模型,擅长自然语言理解和生成,支持长文本解析、数据预测、代码生成等复杂任务。Qwen-Long作为其变体,专为长上下文场景优化,适用于大型文档处理、知识图谱构建等。Qwen2.5在ESG报告解析、多Agent协作、数学模型生成等方面表现出色,提供灵活且高效的解决方案。
495 49
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
251 3
秒级响应 + 99.9%准确率:法律行业文本比对技术解析
本工具基于先进AI技术,采用自然语言处理和语义匹配算法,支持PDF、Word等格式,实现法律文本的智能化比对。具备高精度语义匹配、多格式兼容、高性能架构及智能化标注与可视化等特点,有效解决文本复杂性和法规更新难题,提升法律行业工作效率。
React 文本区域组件 Textarea:深入解析与优化
本文介绍了 React 中 Textarea 组件的基础用法、常见问题及优化方法,包括状态绑定、初始值设置、样式自定义、性能优化和跨浏览器兼容性处理,并提供了代码案例。
149 8
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
HTTPS协议是**一种通过计算机网络进行安全通信的传输协议
111 11
HTTPS协议的历史发展
HTTPS协议的历史发展
135 8
判断一个网站是否使用HTTPS协议
判断一个网站是否使用HTTPS协议
564 4
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
262 3
如何解析一个 HTML 文本
【10月更文挑战第23天】在实际应用中,根据具体的需求和场景,我们可以灵活选择解析方法,并结合其他相关技术来实现高效、准确的 HTML 解析。随着网页技术的不断发展,解析 HTML 文本的方法也在不断更新和完善,

热门文章

最新文章

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等