在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. 【ZJ选讲·字符串折叠】

    给一个字符串(len<=100) 把这个字符串折叠(就是压缩) 记 X(子串) 表示重复 X次该子串 比如 3(orz)  orzorzorz  来点神奇例子: AAAAAAAAAA ...

  2. BZOJ1415: [Noi2005]聪聪和可可 最短路 期望概率dp

    首先这道题让我回忆了一下最短路算法,所以我在此做一个总结: 带权: Floyed:O(n3) SPFA:O(n+m),这是平均复杂度实际上为O(玄学) Dijkstra:O(n+2m),堆优化以后 因 ...

  3. 7月19日day11总结

    今天学习过程和小结 上午进行测试复习了 1,hdfs中namenode和datanode作用 2,hdfs副本存放机制 3,mapreduce计算处理过程 4,格式化hdfs命令 5,hdfs的核心配 ...

  4. Python爬虫学习笔记之爬取新浪微博

    import requests from urllib.parse import urlencode from pyquery import PyQuery as pq from pymongo im ...

  5. 使用e.target.dataset的问题

    在微信开发中我们经常会用到标签中属性的属性值,有时候我们通过 data-* 和 e.target.dateset 来获取属性值会出现一点小bug,即是调用出来的数据是undefined. 1)方案1– ...

  6. 【数据结构】bzoj1455罗马游戏

    Description 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻 ...

  7. Matlab xpC启动盘

    要点: 1.target PC的网卡支持类型有限: 2.网上所列教程未必适用于本地,仅以两图表示: a,带有图形界面时容易出错: b,启动选项为Removable Device:

  8. 「6月雅礼集训 2017 Day2」A

    [题目大意] 给出一棵树,求有多少对点(u,v)满足其路径上不存在两个点a,b满足(a,b)=1 n<=10^5 [题解] 考虑找出所有不符合的点对,共有n*ln(n)对,他们要么是祖先-> ...

  9. ShadowBroker公开的SMB远程命令执行漏洞修复

    有人不知道如何获得MS对应的补丁KB编号,可以看这篇文章了~ 漏洞编号为ms17-010,如何查看对应MS号的补丁已经安装: 下载微软官方的补丁信息列表(Microsoft Security Bull ...

  10. 无线路由器中WMM/Short GI/AP隔离各是什么功能, 开启时PC无法ping通手机.

      无线路由器的WMM功能和开启ap隔离,以及开启ShortGI有什么用 无线路由器中有开启WMM.开启Short GI和开启AP隔离分别代表什么呢?这是我在我的TP-LINK无线路由器TL-WR84 ...