HTTP传输数据有四种方式:Get方式、Post方式、同步请求方式、异步请求方式。具体的介绍,前面已经有过系统的讲解,这次主要进行具体的举。

说明:同步和异步请求方式在创建链接对象和创建请求对象时,用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);
}

它们俩的运行结果都是:

-- ::45.053 -NSURLConnection[:] admin123456<br />
<b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b></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);
}
}

运行结果:

-- ::15.010 -NSURLConnection[:] admin123456<br />
<b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b></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);
}
}];
}

运行结果:

-- ::32.407 -NSURLConnection[:] async:admin123456<br />
<b>Notice</b>: Undefined index: userid in <b>/Applications/XAMPP/xamppfiles/htdocs/userManager/login.php</b> on line <b></b><br />
admin 欢迎你!进入 <a href="my.php">用户中心</a><br />点击此处 <a href="login.php?action=logout">注销</a> 登录!<br />

iOS:网络编程解析协议一:HTTP超文本传输协议的更多相关文章

  1. Java 网络编程(二) 两类传输协议:TCP UDP

    链接地址:http://www.cnblogs.com/mengdd/archive/2013/03/09/2951841.html 两类传输协议:TCP,UDP TCP TCP是Transfer C ...

  2. TCP/IP协议网络编程以及UDP和TCP之传输协议

    1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...

  3. iOS网络编程解析协议三:JSON数据传输解析

    作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式 基于JavaScript的一个子集 易读性略差,编码手写难度大,数据量小 JSON格式取代了XML给网络传输带来了很大的便利, ...

  4. iOS网络编程解析协议二:XML数据传输解析

    XML两种解析方式,一种是SAX,NSXMLParser是SAX方法解析,另一种是DOM(Document Object Model); 区别: SAX: 只能读,不能修改,只能顺序访问,适合解析大型 ...

  5. 浅谈iOS网络编程之一入门

    计算机网络,基本上可以抽象是端的通信.实际在通讯中会用到不同的设备,不同的硬件中,为了能友好的传输信息,那么建立一套规范就十分必要了.先来了解一些基本概念 了解网络中传输的都是二进制数据流.  2.了 ...

  6. iOS 网络编程(HTTP协议)

    HTTP协议的概念HTTP协议,Hyper Text Transfer Protocol (超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响应 ...

  7. iOS网络编程模型

    iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...

  8. Android网络编程要学的东西与Http协议学习

    本节引言: 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程是要干嘛?http协议的学习,使用自带扣脚Json解析类解析Json,XML解析常用的几种方式,HttpUr ...

  9. Fixed-Length Frames 谈谈网络编程中应用层(基于TCP/UDP)的协议设计

    http://blog.sina.com.cn/s/blog_48d4cf2d0101859x.html 谈谈网络编程中应用层(基于TCP/UDP)的协议设计 (2013-04-27 19:11:00 ...

  10. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

随机推荐

  1. vscode vue配置和一些其它辅助【工具篇】

    后续有补充就经常更新

  2. 【LOJ】 #2008. 「SCOI2015」小凸想跑步

    题解 一道想法很简单的计算几何(由于我半平面交总是写不对,我理所当然的怀疑半平面交错了,事实上是我直线建错了) 首先我们对于两个凸包上的点设为\((x_0,y_0)\)和\((x_1,y_1)\)(逆 ...

  3. bzoj 1856 卡特兰数

    复习了一下卡特兰数.. #include<bits/stdc++.h> #define LL long long #define fi first #define se second #d ...

  4. CodeForces 803F Coprime Subsequences

    $dp$. 记$dp[i]$表示$gcd$为$i$的倍数的子序列的方案数.然后倒着推一遍减去倍数的方案数就可以得到想要的答案了. #include <iostream> #include ...

  5. HDU 6026 Deleting Edges

    最短路. 先建一个只包含最短路的有向无环图,每一个点选择任意一条入边即可生成一个树形图,那么树的种类就等于每个点的入度乘积. #include <bits/stdc++.h> using ...

  6. java_方法

    方法 1.1方法概述 在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法. 如:小明同学在路边准备坐车来学校学习.这就面临着一件事情(坐车到学校这件事情)需要解决,解决办法呢?可采用坐公 ...

  7. aop相关术语

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面的编程.并不是全部的AOP框架都是一样的.他们连接点模型的功能可能有强弱之分,有些可以字段,方法,构 ...

  8. functools.wraps 带参数的装饰器 多个装饰器装饰同一个函数

    装饰器开发原则 : 开放封闭原则装饰器的作用 :在不改变原函数的调用方式的情况下,在函数的前后添加功能装饰器的本质 : 闭包函数 def wrapper(func): def inner(*args, ...

  9. vmware12安装centos7系统详解

    1.首先需要准备的工具有vmware12和contos7的系统. vmvare12下载地址: http://pan.baidu.com/s/1i5vH50D contos7我自己使用的为1511版本. ...

  10. 二维数组sort排序

    和副本任务完全无关的奇怪感慨: 完全搞不懂我为什么会在搞图论的时候学这种奇怪东西,需要的时候不会,不需要的时候又莫名增加了奇怪的技能点. 之前的假期规划在十多天的放飞自我中彻底泡汤,简单的图论都一点不 ...