zoukankan      html  css  js  c++  java
  • (转) 网络GET、POST方法

    在iOS中,常见的发送HTTP请求(GET和POST)的解决方案有
    苹果原生(自带)
    NSURLConnection:用法简单,最古老最直接的一种方案
    NSURLSession:iOS7新出的技术,功能比NSURLConnection更加强大
    CFNetwork:NSURL*的底层,纯C语言
     
    第三方框架
    ASIHttpRequest:外号“HTTP终结者”,功能极其强大,可惜早已停止更新
    AFNetworking:简单易用,提供了基本够用的常用功能
     
     
     
     

    NSURLConnection常用类

    主要为三个对象:

    NSURL 

    请求的地址

    NSURLRequest(NSMutableURLRequest:NSURLRequest的子类) 

    封装一个请求,保存发给服务器的全部数据

    NSURLConnection
    负责发送请求,建立客户端和服务器的连接
    发送NSURLRequest的数据给服务器,并收集来自服务器的响应数据
     

    使用步骤

    1.创建一个NSURL对象,设置请求路径
    2.传入NSURL创建一个NSURLRequest对象,设置请求头和请求体
    (GET方法不需要设置请求体,POST方法需要设置请求体)
    3.使用NSURLConnection发送NSURLRequest
    (  可使用3中方式发送,同步方法,异步方法,代理方法(异步方式))
     
     
     
    代码示例:
    1.创建一个NSURL对象,设置请求路径
    2.传入NSURL创建一个NSURLRequest对象,设置请求头和请求体
    (1. GET方式)
    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. // 1.1.1 设置请求路径  
    2. NSString *urlStr = [NSString stringWithFormat:@"http://192.168.1.200:8080/MJServer/login?username=%@&pwd=%@", username, pwd];  
    3.   
    4. // 1.1.2转码 (URL里面不能包含中文,所以需要转码)  
    5. urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];  
    6.   
    7. // 1.1.3 URL里面不能包含中文  
    8. NSURL *url = [NSURL URLWithString:urlStr];  
    9.   
    10. // 2.1.2.根据url创建请求对象(NSURLRequest 不能修改request的值,所以使用可变请求)  
    11. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 默认就是GET请求  
    12. request.timeoutInterval = 5; // 设置请求超时  
     
    (2. POST方式)
     
    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. // POST请求:请求体  
    2.   
    3. // 1.2.1.设置请求路径  
    4. NSURL *url = [NSURL URLWithString:@"http://192.168.1.200:8080/MJServer/login"];  
    5.   
    6. // 2.2.1.创建请求对象  
    7. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 默认就是GET请求  
    8. request.timeoutInterval = 5; // 设置请求超时  
    9. request.HTTPMethod = @"POST"; // 设置为POST请求  
    10.   
    11. // 2.2.2通过请求头告诉服务器客户端的类型  
    12. [request setValue:@"ios" forHTTPHeaderField:@"User-Agent"];  
    13.   
    14. // 2.2.3设置请求体  
    15. NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", username, pwd];  
    16. request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];  

    GET和POST对比
    GET和POST的主要区别表现在数据传递上
    GET
    在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如

    http://ww.test.com/login?username=123&pwd=234&type=JSON

    由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB
    POST
    发给服务器的参数统统放在请求体中
    理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)




      (接上面的代码)

    3.1.使用NSURLConnection发送NSURLRequest (同步方法)

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. // 3.1.1 使用同步方式发送请求(此方法是在主线程中发送,UI会卡,基本不使用)  
    2. NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];  
    3. // 3.1.2把data转换成字符串答应  
    4. NSString *dataStr= [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];  
    5. NSLog(@"%@",dataStr);  



    3.2.使用NSURLConnection发送NSURLRequest (异步方法)

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. //3.2.1 使用异步方式发送请求(一般会根据获得的data数据来刷新UI空间,所以队列使用 mainQueue)  
    2. NSOperationQueue *queue = [NSOperationQueue mainQueue];  
    3. [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {  // 当请求结束的时候调用 (拿到了服务器的数据, 请求失败)  
    4.       
    5.     //3.2.2 把data转换成字符串答应  
    6.     NSString *dataStr= [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];  
    7.     NSLog(@"%@",dataStr);  
    8.     /** 
    9.      解析data : 
    10.      {"error":"用户名不存在"} 
    11.      {"error":"密码不正确"} 
    12.      {"success":"登录成功"} 
    13.      */  
    14.         /** 
    15.          if (data) { // 请求成功 
    16.             NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil]; 
    17.             NSString *error = dict[@"error"]; 
    18.             if (error) { // 登录失败 
    19.                 [MBProgressHUD showError:error]; 
    20.             } else { // 登录成功 
    21.                 NSString *success =  dict[@"success"]; 
    22.                 [MBProgressHUD showSuccess:success]; 
    23.             } 
    24.         } else { // 请求失败 
    25.             [MBProgressHUD showError:@"网络繁忙, 请稍后再试"]; 
    26.         } 
    27.          */  
    28. }];  



    3.3.使用NSURLConnection发送NSURLRequest (代理方法,异步方式)

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. // 3.3.1 设置request 与 代理  
    2. NSURLConnection *conn4 = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];  
    3. // 3.3.2 发送请求  
    4. [conn4 start];  


    需要实现代理 

    <NSURLConnectionDataDelegate>

    一下是代理方法

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. #pragma mark - NSURLConnectionDataDelegate 代理方法  
    2. /** 
    3.  *  请求错误(失败)的时候调用(请求超时断网没有网, 一般指客户端错误) 
    4.  */  
    5. - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  
    6. {  
    7.     NSLog(@"connection:didFailWithError:");  
    8.   
    9. }  
    10.   
    11. /** 
    12.  *  当接受到服务器的响应(连通了服务器)就会调用 
    13.  */  
    14. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  
    15. {  
    16.     NSLog(@"connection:didReceiveResponse:");  
    17.       
    18.     // 初始化数据  
    19.     /** 
    20.      *  用来存放服务器返回的所有数据 
    21.      *  @property (nonatomic, strong) NSMutableData *responseData; 
    22.      */  
    23.         self.responseData = [NSMutableData data];  
    24. }  
    25.   
    26. /** 
    27.  *  当接受到服务器的数据就会调用(可能会被调用多次, 每次调用只会传递部分数据) 
    28.  */  
    29. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  
    30. {  
    31.     NSLog(@"connection:didReceiveData:");  
    32.       
    33.     // 拼接(收集)数据  
    34.     [self.responseData appendData:data];  
    35. }  
    36.   
    37. /** 
    38.  *  当服务器的数据接受完毕后就会调用 
    39.  */  
    40. - (void)connectionDidFinishLoading:(NSURLConnection *)connection  
    41. {  
    42.     NSLog(@"connectionDidFinishLoading:");  
    43.       
    44.     // 解析服务器返回的数据  
    45.     NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil];  
    46.     NSString *error =  dict[@"error"];  
    47.     if (error) { // 登录失败  
    48.         NSLog(@"登录失败");  
    49.           
    50.     } else { // 登录成功  
    51.         NSString *success =  dict[@"success"];  
    52.         NSLog(@"登录成功:%@",success);  
    53.     }  
    54. }  



    链接:http://blog.csdn.net/dwt1220/article/details/45196161

  • 相关阅读:
    .NE 学习概要
    (转)工作之路---记录LZ如何在两年半的时间内升为PM
    XP下Winform背景透明问题
    CSE(Corrupted State Exceptions) 严重异常处理办法
    (转)C#模拟键盘鼠标事件
    (转).net项目技术选型总结
    (转)MSMQ续
    (转)MSMQ(消息队列)
    (转)TCP三次握手
    Socket编程初探
  • 原文地址:https://www.cnblogs.com/lizhitai/p/4517313.html
Copyright © 2011-2022 走看看