在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方式)
  1. // 1.1.1 设置请求路径
  2. NSString *urlStr = [NSString stringWithFormat:@"http://192.168.1.200:8080/MJServer/login?username=%@&pwd=%@", username, pwd];
  3. // 1.1.2转码 (URL里面不能包含中文,所以需要转码)
  4. urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
  5. // 1.1.3 URL里面不能包含中文
  6. NSURL *url = [NSURL URLWithString:urlStr];
  7. // 2.1.2.根据url创建请求对象(NSURLRequest 不能修改request的值,所以使用可变请求)
  8. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 默认就是GET请求
  9. request.timeoutInterval = 5; // 设置请求超时
 
(2. POST方式)
 
  1. // POST请求:请求体
  2. // 1.2.1.设置请求路径
  3. NSURL *url = [NSURL URLWithString:@"http://192.168.1.200:8080/MJServer/login"];
  4. // 2.2.1.创建请求对象
  5. NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; // 默认就是GET请求
  6. request.timeoutInterval = 5; // 设置请求超时
  7. request.HTTPMethod = @"POST"; // 设置为POST请求
  8. // 2.2.2通过请求头告诉服务器客户端的类型
  9. [request setValue:@"ios" forHTTPHeaderField:@"User-Agent"];
  10. // 2.2.3设置请求体
  11. NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", username, pwd];
  12. 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 (同步方法)

  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 (异步方法)

  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. //3.2.2 把data转换成字符串答应
  5. NSString *dataStr= [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
  6. NSLog(@"%@",dataStr);
  7. /**
  8. 解析data :
  9. {"error":"用户名不存在"}
  10. {"error":"密码不正确"}
  11. {"success":"登录成功"}
  12. */
  13. /**
  14. if (data) { // 请求成功
  15. NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
  16. NSString *error = dict[@"error"];
  17. if (error) { // 登录失败
  18. [MBProgressHUD showError:error];
  19. } else { // 登录成功
  20. NSString *success =  dict[@"success"];
  21. [MBProgressHUD showSuccess:success];
  22. }
  23. } else { // 请求失败
  24. [MBProgressHUD showError:@"网络繁忙, 请稍后再试"];
  25. }
  26. */
  27. }];

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

  1. // 3.3.1 设置request 与 代理
  2. NSURLConnection *conn4 = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
  3. // 3.3.2 发送请求
  4. [conn4 start];

需要实现代理

<NSURLConnectionDataDelegate>

一下是代理方法

  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. - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
  13. {
  14. NSLog(@"connection:didReceiveResponse:");
  15. // 初始化数据
  16. /**
  17. *  用来存放服务器返回的所有数据
  18. *  @property (nonatomic, strong) NSMutableData *responseData;
  19. */
  20. self.responseData = [NSMutableData data];
  21. }
  22. /**
  23. *  当接受到服务器的数据就会调用(可能会被调用多次, 每次调用只会传递部分数据)
  24. */
  25. - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
  26. {
  27. NSLog(@"connection:didReceiveData:");
  28. // 拼接(收集)数据
  29. [self.responseData appendData:data];
  30. }
  31. /**
  32. *  当服务器的数据接受完毕后就会调用
  33. */
  34. - (void)connectionDidFinishLoading:(NSURLConnection *)connection
  35. {
  36. NSLog(@"connectionDidFinishLoading:");
  37. // 解析服务器返回的数据
  38. NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil];
  39. NSString *error =  dict[@"error"];
  40. if (error) { // 登录失败
  41. NSLog(@"登录失败");
  42. } else { // 登录成功
  43. NSString *success =  dict[@"success"];
  44. NSLog(@"登录成功:%@",success);
  45. }
  46. }

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

(转) 网络GET、POST方法的更多相关文章

  1. Linux下多网卡同网段多IP网络分流设定方法

    Linux下多网卡同网段多IP网络分流设定方法 -- :: 标签:Linux下多网卡同网段多IP网络分流设定方法 当服务器需要较高的网络流量时,在其它资源不造成瓶颈的情况下无疑会用到多网卡. 第1选项 ...

  2. Linux 下网络性能优化方法简析

    概述 对于网络的行为,可以简单划分为 3 条路径:1) 发送路径,2) 转发路径,3) 接收路径,而网络性能的优化则可基于这 3 条路径来考虑.由于数据包的转发一般是具备路由功能的设备所关注,在本文中 ...

  3. iphone抓取移动网络报文的方法

    iphone抓取移动网络报文的方法 对iPhone进行越狱,网上有很多教程,这里不做说明.越狱后会有cydia这个app,首先对用户身份进行设置,选用开发者身份.打开这个应用,搜索openssh,找到 ...

  4. Android 下使用tcpdump网络抓包方法

    Android 下使用tcpdump网络抓包方法 抓包需要tcpdump以及Root权限,tcpdump在本文后有下载. 首先把tcpdump传进手机,用adb命令(放SD卡有时会有问题,我一次可以用 ...

  5. 【转载】WIN7访问共享:0x80070035 找不到网络路径解决方法

    转载:http://blog.chinaunix.net/uid-12372814-id-3518571.html 昨天刚装WIN7系统,今天早上准备访问服务器安装些软件,结果出现网络错误,提示Win ...

  6. 排错-Loadrunner添加Windows Resource计数器提示“找不到网络路径”解决方法

    Loadrunner添加Windows Resource计数器提示“找不到网络路径”解决方法 by:授客 QQ:1033553122 1.启动windows相关服务 win->services. ...

  7. swift网络数据请求方法

    搭建一个apache服务器,用php编写一个返回给客户端请求数据的脚本 <?php // header("Content-type:text/html;charset=utf-8&qu ...

  8. 蜂窝网络TDOA定位方法的Fang算法研究及仿真纠错

    科学论文为我们提供科学方法,在解决实际问题中,能极大提高生产效率.但论文中一些失误则可能让使用者浪费大量时间.自己全部再推导那真不容易,怀疑的成本特别高,通常不会选择这条路.而如果真是它的问题,其它所 ...

  9. flask使用第三方云通讯平台时,出现{'172001':'网络错误'}解决方法

    问题描述:flask使用第三方云通讯平台时,出现{'172001':'网络错误'} 解决方法: 在sms.py文件中添加如下代码 import ssl # 取消证书验证ssl._create_defa ...

  10. Linux网络性能优化方法简析

    Linux网络性能优化方法简析 2010-12-20 10:56 赵军 IBMDW 字号:T | T 性能问题永远是永恒的主题之一,而Linux在网络性能方面的优势则显而易见,这篇文章是对于Linux ...

随机推荐

  1. BZOJ3529 [Sdoi2014]数表 【莫比乌斯反演】

    3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 2151 Solved: 1080 [Submit][Status ...

  2. HDU1054 Strategic Game(最小点覆盖)

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  3. 在Global.asax中过滤POST请求的非法参数。

    using System;using System.Collections.Generic;using System.Collections.Specialized;using System.Linq ...

  4. canvas压缩图片变模糊问题

    canvas 画图图片变模糊问题 问题描述 在使用 canvas 对图片进行编辑导出图片之后发现图片和原图相比变得模糊了 canvas 画图线条变粗 问题产生原因 该问题在 PC 下面并不会产生,原因 ...

  5. jquery教程-Jquery 获取标签个数 size()函数用法

    jquery教程-Jquery 获取标签个数 size()函数用法,size() 方法返回被 jQuery 选择器匹配的元素的数量. 语法 $(selector).size()     jQuery ...

  6. BZOJ 2063: 我爸是李刚

    2063: 我爸是李刚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 155  Solved: 82[Submit][Status][Discuss] ...

  7. linux驱动学习(八) i2c驱动架构(史上最全) davinc dm368 i2c驱动分析【转】

    转自:http://blog.csdn.net/ghostyu/article/details/8094049 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 预备知识 lin ...

  8. 自动化测试===【转】Robot Framework作者建议如何选择自动化测试框架

    原文:http://www.infoq.com/cn/news/2012/06/robot-author-suggest-autotest 软件自动化测试,作为手工测试的替代,越来越受到关注.Pekk ...

  9. CSS3制作旋转的小风车

    制作旋转小风车 一 我先搭建一个大盒子400x400px大盒子里面嵌套四个小盒子200x200px,放在一起肯定是四个排在一行,我想要的效果是上下各两个, css样式 *{ margin:0; pad ...

  10. swap增加

    #创建17G的文件dd if=/dev/zero of=/data/swap/swap-1 bs=1024 count=16255000#设置为swap分区/sbin/mkswap /data/swa ...