您的位置:首页 > 理论基础 > 计算机网络

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

2015-09-24 13:15 591 查看
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);
}


它们俩的运行结果都是:

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 />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: