1、get:

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:

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:

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.}

最后,请求能够设置超时时间:

或者:

1.NSMutableURLRequest
* request = [[NSMutableURLRequest alloc]initWithURL:URL];
2.[request
setTimeoutInterval:
8.0];

请求时间超过所设置的超时时间。会自己主动调用

可是有个问题是怎么把推断是超时导致的请求失败,上面的样例里已经写了,能够依据返回的error的code进行推断。了解不同情况的请求失败,能够更好的给用户提示。

iOS上的http请求:get、post以及同步、异步的更多相关文章

  1. IOS网络编程之请求内容

    资料均来自互联网,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任. 人魔七七:http://www.cnblogs.com/qiqibo/ 一个http请求只要由三 ...

  2. iOS - NetRequest 网络数据请求

    1.网络请求 1.1 网络通讯三要素 1.IP 地址(主机名): 网络中设备的唯一标示.不易记忆,可以用主机名(域名). 1) IP V4: 0~255.0~255.0~255.0~255 ,共有 2 ...

  3. IOS上传文件开发

    IOS上传文件开发     在移动应用开发  文件形式上传是不可缺少的,近期把IOS这块文件上传文件代码简单的整理一下.假设大家有须要安卓这边的代码,本人也能够分享给大家! QQ群:74432915 ...

  4. ios 上浏览器返回上一页不会刷新页面问题,页面初始化的方法不执行

    https://blog.csdn.net/yang450712123/article/details/79276102 https://blog.csdn.net/Chengbin_Huang/ar ...

  5. Charles抓包(iOS的http/https请求)

    Charles抓包(iOS的http/https请求) Charles安装 HTTP抓包 HTTPS抓包 1. Charles安装 官网下载安装Charles:https://www.charlesp ...

  6. iOS网络_优化请求性能

    iOS网络_优化请求性能 一,度量网络性能 1,网络带宽 用于描述无线网络性能的最常见度量指标就是带宽.在数字无线通信中,网络带宽可以 描述为两个端点之间的通信通道每秒钟可以传输的位数.现代无线网络所 ...

  7. iOS开发高级分享 - iOS上的设备标识符和指纹

    苹果认可的标识符 Apple提供了各种API,以方便用户识别各种用途: 通用标识符(UDID) 在iOS的早期,苹果公司提供了一个uniqueIdentifier财产上UIDevice-亲切地称为ud ...

  8. 记录axios在IOS上不能发送的问题

    最近 遇到 了axios在IOS上无法发送的问题,测试 了两个 苹果 机,IOS10上不能发送,IOS12可以,百度了下,找到了解决方法.记录下吧 首先引入qs,这个安装axios也已经有了吧:然后在 ...

  9. 细数iOS上的那些安全防护

    细数iOS上的那些安全防护  龙磊,黑雪,蒸米 @阿里巴巴移动安全 0x00 序 随着苹果对iOS系统多年的研发,iOS上的安全防护机制也是越来越多,越来越复杂.这对于刚接触iOS安全的研究人员来说非 ...

随机推荐

  1. Oracle Data Integrator 12c-模型(Model)和 数据存储(DataStore)

    一.概念 Model模型: 描述关系型数据的模型. 是一组存放在特定的技术(如Oracle)的数据存储的集合.例如当技术为Oracle时,对应于数据库的Scheme DataStore: 数据存储 一 ...

  2. Oracle NET工作原理、配置及连接问题排查

    一.Oracle NET配置文件 Oracle NET是一个软件层,支持不同网络协议之间的转换.不同的物理机器可以借助这个软件层实现相互间的通信,具体而言就是实现对oracle的远程访问. oracl ...

  3. Java List/Set/Map

  4. Android实现中文汉字笔划(笔画)、中文拼音排序、英文排序

    发布时间:2018-11-16   技术:Android   概述 最近要做一个类似微信的,在登录界面选择国家地区的功能,微信有中文汉字笔画排序以及中文拼音排序等几种方式,如下所示: 简体中文 拼音排 ...

  5. 基于JavaWeb实现的研究室综合系统

    代码地址如下:http://www.demodashi.com/demo/14641.html 概述 基于JavaWeb实现的研究室综合系统,功能包括研究室成员注册.登陆,后台管理,相册功能,新闻模块 ...

  6. [Spring学习笔记 7 ] Spring中的数据库支持 RowMapper,JdbcDaoSupport 和 事务处理Transaction

    1.Spring中的数据库支持 把具有相同功能的代码模板抽取到一个工具类中.2.关于jdbc template的应用 jdbcTemplate模板操作类,把访问jdbc的模板抽取到template中, ...

  7. 基于 CoreText 实现高性能 UITableView

    引起UITableView卡顿比较常见的原因有cell的层级过多.cell中有触发离屏渲染的代码(譬如:cornerRadius.maskToBounds 同时使用).像素是否对齐.是否使用UITab ...

  8. 蓝牙进阶之路 (003) - AT指令(转)

    一 . 一 般 命 令 1.AT+CGMI      给出模块厂商的标识. 2.AT+CGMM    获得模块标识.这个命令用来得到支持的频带(GSM 900,DCS 1800    或PCS 190 ...

  9. dubbo 学习(5) dubbo多协议和多注册中心

    转载 http://blog.csdn.net/songjinbin/article/details/49498431 一.配置dubbo多协议模式 1.默认协议 Dubbo缺省协议采用单一长连接和N ...

  10. Http网络协议

    目录结构: contents structure [-] 什么是HTTP协议 Http协议的发展历史 Http的报文结构 客户端请求 服务端响应消息 Content-Type application/ ...