iOS上的http请求:get、post以及同步、异步
1、get:
sourceprint
" class="item about" style="color:rgb(51,51,51); text-decoration:none; margin:0px 0px 0px 8px; padding:0px; border-width:0px 0px 1px; border-bottom-style:dotted; border-bottom-color:rgb(51,51,51); outline:0px; float:left; vertical-align:baseline; position:static; left:auto; top:auto; right:auto; bottom:auto; height:16px; width:16px; display:block; overflow:hidden; text-indent:-5000px">?
01.<span
style="font-size:14px;">NSString
* URLString = @"theRegionCode=" style="color:rgb(51,51,51); text-decoration:none; border-bottom-width:1px; border-bottom-color:rgb(51,51,51); border-bottom-style:dotted">http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=
广东";02.NSURL
* URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];03. 04.NSURLRequest
* request = [[NSURLRequest alloc]initWithURL:URL];05.NSURLResponse
* response = nil;06.NSError
* error = nil;07.NSData
* data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];08.if (error)
{09.NSLog(@"error:
%@",[error
localizedDescription]);10.}else{11.NSLog(@"response
: %@",response);12.NSLog(@"backData
: %@",[[NSString
alloc]initWithData:data encoding:NSUTF8StringEncoding]);13.}14.</span>get方法的请求參数是放在长长的URL字符串里面。这里仅仅须要一个參数,就是地区的编号或名字,通过这个參数,server返回属于这个区域内支持天气查找的城市列表。假设有很多其它的參数也是放在URL字符串里面,至于參数的组织方式,就看server的要求了。
用字符串构建NSURL,最好在使用URLWithString的时候把原字符串进行一下UTF8转码。关于为何要转码。看下这里第一部分。然后NSURL对象构建NSURLRequest。使用NSURLConnection的同步方法。传入request对象就能够通过get方法获取数据。
这里有个NSError对象地址传入,用于做错误推断。网络的实际情况是多变的。必需要考虑请求错误的情况。否则可能导致程序奔溃。
2、post:
01.NSString
* URLString = @"http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityString";02.NSURL
* URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];03. 04.NSString
* postString = @"theRegionCode=广东";05.NSData
* postData = [postString dataUsingEncoding:NSUTF8StringEncoding]; //将请求參数字符串转成NSData类型06. 07.NSMutableURLRequest
* request = [[NSMutableURLRequest alloc]init];08.[request
setHTTPMethod:@"post"]; //指定请求方式09.[request
setURL:URL]; //设置请求的地址10.[request
setHTTPBody:postData]; //设置请求的參数11. 12.NSURLResponse
* response;13.NSError
* error;14.NSData
* backData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];15. 16.if (error)
{17.NSLog(@"error
: %@",[error
localizedDescription]);18.}else{19.NSLog(@"response
: %@",response);20.NSLog(@"backData
: %@",[[NSString
alloc]initWithData:backData encoding:NSUTF8StringEncoding]);21.}post方式的时候參数是放在HTTPBody里面的,并且须要将字符串转码成响应的NSData类型。在接口文档里一般都有指出转码方式。须要按指定方式转码,这里的UTF8,也有gb2312的。request构建好了之后,和get方法一样使用NSURLConnection请求数据。
3、同步和异步请求:
一般网络请求都须要一段时间,哪怕数据再少、网络再好。都会有一段时间,并且非常多时候必须考虑在网络不好的时候的app状态。
使用同步请求仅仅需安心等待数据就能够。不须要做额外操作,上面两例都是同步请求。connection调用方法后会把返回请求的数据,无需做什么其它事。可是同步会堵塞线程,假设通过点击button来发起请求,那么按钮会停留在highLight状态直到请求结束,会造成一种app卡住、死机的感觉,非常不好。
异步get:
1.NSString
* URLString = @"theRegionCode=" style="color:rgb(51,51,51); text-decoration:none; border-bottom-width:1px; border-bottom-color:rgb(51,51,51); border-bottom-style:dotted">http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx/getSupportCityDataset?theRegionCode=
广东";2.NSURL
* URL = [NSURL URLWithString:[URLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];3. 4.NSURLRequest
* request = [[NSURLRequest alloc]initWithURL:URL];5. 6._connection
= [[NSURLConnection alloc]initWithRequest:request delegate:self]; (1)异步post类似,不再是使用NSURLConnection调用方法直接得到数据,而是使用(1)位置方法构建一个NSURLConnection对象,这种方法会默认開始请求数据。接下来关键就是靠托付了。由于请求的时间未知,所以使用托付模式的回调作用。在数据回来是调用协议方法。post和get托付方法处理一样。
协议方法:
要注意的是这里有两个托付:NSURLConnectionDataDelegate和NSURLConnectionDelegate,前一个继承于后一个。获取数据的方法是定义在前一个托付里面的。所以仅仅要遵循NSURLConnectionDataDelegate就能够了。
一般用到四个托付方法:
01.<pre
name="code" class="objc">//接受到respone,这里面包括了HTTP请求状态码和数据头信息。包括数据长度、编码格式等02.-(void)connection:(NSURLConnection
*)connection didReceiveResponse:(NSURLResponse *)response{ NSLog(@"response
= %@",response);
_backData = [[NSMutableData alloc]init];03.}04. 05.//接受到数据时调用,完整的数据可能拆分为多个包发送。每次接受到数据片段都会调用这种方法,所以须要一个全局的NSData对象。用来把每次的数据拼接在一起06.-(void)connection:(NSURLConnection
*)connection didReceiveData:(NSData *)data{07.[_backData
appendData:data];08.}09. 10.//数据接受结束时调用这种方法,这时的数据就是获得的完整数据了,能够使用数据做之后的处理了11.-(void)connectionDidFinishLoading:(NSURLConnection
*)connection{12.NSLog(@"%@",[[NSString
alloc]initWithData:_backData encoding:NSUTF8StringEncoding]);13.}14. 15.//这是请求出错是调用,错误处理不可忽视16.-(void)connection:(NSURLConnection
*)connection didFailWithError:(NSError *)error{17.if (error.code
== NSURLErrorTimedOut) {18.NSLog(@"请求超时");19.}20.NSLog(@"%@",[error
localizedDescription]);21.}最后,请求能够设置超时时间:
sourceprint
" class="item about" style="color:rgb(51,51,51); text-decoration:none; margin:0px 0px 0px 8px; padding:0px; border-width:0px 0px 1px; border-bottom-style:dotted; border-bottom-color:rgb(51,51,51); outline:0px; float:left; vertical-align:baseline; position:static; left:auto; top:auto; right:auto; bottom:auto; height:16px; width:16px; display:block; overflow:hidden; text-indent:-5000px">?
1.NSURLRequest
* request = [[NSURLRequest alloc]initWithURL:URL cachePolicy:0 timeoutInterval:8.0];</span>或者:
1.NSMutableURLRequest
* request = [[NSMutableURLRequest alloc]initWithURL:URL];2.[request
setTimeoutInterval:8.0];请求时间超过所设置的超时时间。会自己主动调用
sourceprint
" class="item about" style="color:rgb(51,51,51); text-decoration:none; margin:0px 0px 0px 8px; padding:0px; border-width:0px 0px 1px; border-bottom-style:dotted; border-bottom-color:rgb(51,51,51); outline:0px; float:left; vertical-align:baseline; position:static; left:auto; top:auto; right:auto; bottom:auto; height:16px; width:16px; display:block; overflow:hidden; text-indent:-5000px">?
1.-(void)connection:(NSURLConnection
*)connection didFailWithError:(NSError *)error可是有个问题是怎么把推断是超时导致的请求失败,上面的样例里已经写了,能够依据返回的error的code进行推断。了解不同情况的请求失败,能够更好的给用户提示。
iOS上的http请求:get、post以及同步、异步的更多相关文章
- IOS网络编程之请求内容
资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 人魔七七:http://www.cnblogs.com/qiqibo/ 一个http请求只要由三 ...
- iOS - NetRequest 网络数据请求
1.网络请求 1.1 网络通讯三要素 1.IP 地址(主机名): 网络中设备的唯一标示.不易记忆,可以用主机名(域名). 1) IP V4: 0~255.0~255.0~255.0~255 ,共有 2 ...
- IOS上传文件开发
IOS上传文件开发 在移动应用开发 文件形式上传是不可缺少的,近期把IOS这块文件上传文件代码简单的整理一下.假设大家有须要安卓这边的代码,本人也能够分享给大家! QQ群:74432915 ...
- ios 上浏览器返回上一页不会刷新页面问题,页面初始化的方法不执行
https://blog.csdn.net/yang450712123/article/details/79276102 https://blog.csdn.net/Chengbin_Huang/ar ...
- Charles抓包(iOS的http/https请求)
Charles抓包(iOS的http/https请求) Charles安装 HTTP抓包 HTTPS抓包 1. Charles安装 官网下载安装Charles:https://www.charlesp ...
- iOS网络_优化请求性能
iOS网络_优化请求性能 一,度量网络性能 1,网络带宽 用于描述无线网络性能的最常见度量指标就是带宽.在数字无线通信中,网络带宽可以 描述为两个端点之间的通信通道每秒钟可以传输的位数.现代无线网络所 ...
- iOS开发高级分享 - iOS上的设备标识符和指纹
苹果认可的标识符 Apple提供了各种API,以方便用户识别各种用途: 通用标识符(UDID) 在iOS的早期,苹果公司提供了一个uniqueIdentifier财产上UIDevice-亲切地称为ud ...
- 记录axios在IOS上不能发送的问题
最近 遇到 了axios在IOS上无法发送的问题,测试 了两个 苹果 机,IOS10上不能发送,IOS12可以,百度了下,找到了解决方法.记录下吧 首先引入qs,这个安装axios也已经有了吧:然后在 ...
- 细数iOS上的那些安全防护
细数iOS上的那些安全防护 龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...
随机推荐
- Servlet简介与生命周期
一:Servlet是什么 Servlet是运行在Web服务器上的Java程序,作为处理来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层.JSP在w ...
- oracle 12c 官方文档 及软件下载
oracle 12c 官方文档 http://www.oracle.com/pls/db121/homepage oracle 12c 软件下载 http://www.oracle.com/techn ...
- 〖Linux〗Kubuntu设置打开应用时就只在打开时的工作区显示
有没有遇到一种情况: 在工作区1打开了应用程序Google Chrome: 这个时间感觉它打开速度比较慢,就快捷键切换到工作区2了: 结果这个时候,Google Chrome就直接在工作区2打开,多不 ...
- 开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引
from: http://www.w3c.com.cn/%E5%BC%80%E6%BA%90%E5%88%86%E5%B8%83%E5%BC%8F%E6%90%9C%E7%B4%A2%E5%B9%B ...
- 【mysql】使用xtrabackup在线增量备份及恢复数据库
一.Percona Xtrabackup 简介 1.Xtrabackup bin目录文件 介绍 1)innobackupex innobackupex 是xtrabackup的一个符号链接 . in ...
- HttpClient库设置超时
HttpClient库API跟Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样. 3.X是正常的Java语法 HttpCli ...
- 编程实践笔记{Java 线程 并发处理 Webservice}(转)
http://www.cnblogs.com/mingzi/archive/2009/03/09/1406694.html 1, 保证线程安全的三种方法: a, 不要跨线程访问共享变量 b, 使共享变 ...
- Lua初学
Lua很火啊,而且跟C,c++可以无缝结合,表示很给力,算是我的第三门语言吧,哈哈! 在官网上下载了源码了,和windows版的,表示编译器也很给力,直接可以用SciTE就可以写代码了. a = 1; ...
- 进阶之路(基础篇) - 003 I/O的模拟的读取
/********************************* 代码功能:读取某引脚的模拟量串口返回数据 使用函数: analogRead(引脚号); //调用10位AD 创作时间:2016*1 ...
- 问题 “No mapping found for HTTP request with URI [/fileupload/upload.do]” 的解决
是因为自己springmvc的配置文件里面不小心删除掉了 <!-- 注解扫描 扫描该包下的注解--> <context:component-scan base-package=&qu ...