zoukankan      html  css  js  c++  java
  • 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 />
  • 相关阅读:
    [PKUSC2018]星际穿越——可持久化线段树+DP
    BZOJ2863[SHOI2012]魔法树——树链剖分+线段树
    BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP
    BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP
    树链剖分讲解及总结(重链剖分+长链剖分)
    Dubbo(3)--dubbo的源码分析
    Dubbo(1)--初识Dubbo
    zookeeper(5)--基于watcher原理实现带注册中心的RPC框架
    模板方法模式
    单例模式
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4835014.html
Copyright © 2011-2022 走看看