这一篇主要总结iOS开发中进行HTTP通信及数据上传下载用到的方法。网络编程中常用的有第三方类库AFNetworking或者iOS7开始新推出的NSURLSession,还有NSURLSession的前任NSURLConnection。一般情况下,使用AFNetworking即可满足绝大多数要求,并且更简洁高效。

1.HTTP协议之POST与GET

访问网络数据大部分都要用到HTTP协议,通过HTTP协议向服务器请求数据,再通过HTTP协议获得服务器的响应数据,常见的操作主要是POST与GET,这两个操作可以满足绝大部分的应用需求了。

GET操作主要使用场景是请求网络资源,例如在浏览器中访问网页就发起了很多GET请求,GET请求的缺点在于安全性不够,参数都在URL中了,并且不同的浏览器对URL长度有不同长度的限制,一些复杂的请求就不适用了。这时候需要用POST请求,POST请求的所有参数都放在请求体中,安全性更好,并且理论上没有数据量的限制,文件上传、账号登陆等都用POST请求。 一般GET请求只适合于简单的查询请求,增删改一般都用POST请求。

2.HTTP请求中的一些参数

(1)请求行,包含请求方法、请求路径、HTTP协议版本信息

(2)请求头,包含访问的服务器主机地址Host、缓存控制指令Cache-Control、客户端类型User-Agent、客户接收数据类型Accept、客户端语言环境Accept-Language以及客户端支持的数据压缩格式Accept-Encoding等等

(3)如果是POST请求,还有请求体信息

3.HTTP响应中的一些参数

(1)状态行,包含了HTTP协议版本、状态码、状态英文名称

(2)响应头,包含服务器类型Server、返回数据类型Content-Type、返回数据长度Content-Length等等

(3)实体内容,即服务器根据客户端的请求返回的数据

4.dataWithContentsOfURL

这是最简单的网络请求,直接指定URL即可使用,但是请求的数据会放在手机内存当中,当下载的数据量较大时是不合理,并且不适用于HTTPS请求,参见之前博客“斯坦福iOS7公开课11笔记及演示Demo&访问HTTPS链接下载数据”

5.NSURLConnection

发起请求有多种方式,也可以设置好请求参数,暂时不发出请求,在某一个地方再触发请求,如图所示

这里我们选用“- connectWithRequest:delegate:”发起一个异步请求,并设置好代理,方便后续代理事件中对响应事件进行处理

在代理方法中对数据进行处理,下载的数据名称从响应信息里获取“response.suggestedFilename”,与服务器端保持一致,需要注意的是,这里是在cache文件夹创建了一个文件,然后不断写入接收到数据,而不是使用NSMutableData,这是因为使用NSMutableData,接收到数据会存放在内存中,如果数据量较大会严重影响性能。所以一般不使用NSMutableData这种方式。

更复杂的情况还有断点续传,对此,首先我们可以从服务器响应信息中获取数据的总长度response.expectedContentLength,并在每次接收数据时更新已接受数据的长度值,将二者的数据存储到沙盒中,中断后重新下载时,根据当前已下载数据的长度值,设置HTTP请求头的中“Range”,按照目前进度继续下载即可。

6.NSURLSession

NSURLSession是iOS7开始新推出的网络基础架构,用来代替NSURLConnection,主要有三个重要的子类:NSURLSessionDataTask、NSURLSessionUploadTask、NSURLSessionDownloadTask,分别用来获取数据、上传文件以及下载文件。并且使用NSURLSession还可以在后台执行上传下载任务,以及NSURLSessionConfiguration的众多设置选项,对于iOS网络编程来说完全足以替代甚至超越NSURLConnection。

 (1)NSURLSessionDataTask

根据URL,使用dataTask获取数据

对于POST请求,还可以构造一个NSMutableURLRequest,对请求体进行设置,调用session的“dataTaskWithRequest”方法即可。

 (2)NSURLSessionDownloadTask

需要注意的是下载文件默认是存放到临时文件夹temp里的,下载完成后需要将其移动到目标位置。

执行下载任务可以直接发起请求下载:

也可以在delegate事件中进行处理:

NSURLSession实现断点下载更为容易,主要是通过“cancelByProducingResumeData”方法的回调事件拿到"resumeData",恢复下载时根据"resumeData"继续下载“

downloadTaskWithResumeData”即可。

  (3)NSURLSessionUploadTask

使用NSURLSessionUploadTask来执行上传任务更为简便,不像NSURLConnection还需要在请求体设置许多参数,一个 request加上要上传的 NSData 对象或者是本地文件路径对应的 NSURL即可。

7.AFNetworking

iOS开发中可能更常用的AFNetWorking,使得网络编程更简洁使用。

下载地址:https://github.com/AFNetworking/AFNetworking

下图为常见的两个使用示例:

需要注意的是:

(1)AFNetworking默认是把返回数据当做JSON来解析的,如果返回数据是XML或者要求对响应数据不进行解析操作,直接返回NSData,需要分别设置解析类型为“AFXMLParserResponseSerializer”、“AFHTTPResponseSerializer”。

(2)实际情况中,返回数据的Content-Type可能不在AFNetworking支持的类型中,需要在“AFURLResponseSerialization.m”中添加对应类型

同时AFNetworking对NSURLSession也进行了封装,所以NSURLSession能做的事情,AFNetworking也能做,并且写法更为简便。

8.网络状态监控

监控网络状态有两种办法

(1)使用苹果提供的“Reachability”(非arc,需要注意设置编译参数):

(2)使用AFNetworking提供的方法:

iOS开发笔记4:HTTP网络通信及网络编程的更多相关文章

  1. IOS开发笔记(4)数据离线缓存与读取

    IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...

  2. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  3. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  4. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  5. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

  6. 【Swift】iOS开发笔记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

  7. 菜鸟手下的iOS开发笔记(swift)

    在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...

  8. iOS开发笔记系列-基础1(数据类型与表达式)

    学习iOS开发快两年了,去年完成MagViewer之后就因为公司的其他业务繁重,除了维护这个应用之外,只是断断续续地自己做一些实验开发,没有再发布新的应用,这里想整理一下学习过程中的笔记,以便加深印象 ...

  9. iOS开发笔记之TableView优化

    TableView相信只要是做iOS开发的就不会陌生,目前大多数iOS的app都是采用TabBar+NavigationBar+TableViewController这一主流框架, 既然用的这么频繁, ...

随机推荐

  1. JavaScript 变量生命周期

    变量在它声明时初始化. 局部变量在函数调用时创建,当函数执行完毕后销毁,这和为什么要使用闭包也有一点关系,当然这是另外的话题了. 全局变量在页面(当前页面)关闭后销毁.

  2. AssetBundle系列——场景资源之解包(二)

    本篇接着上一篇继续和大家分享场景资源这一主题,主要包括两个方面: (1)加载场景 场景异步加载的代码比较简单,如下所示: private IEnumerator LoadLevelCoroutine( ...

  3. Unity 中的协同程序

    今天咱就说说,协同程序coroutine.(这文章是在网吧敲的,没有unity,但是所有结论都被跑过,不管你信得过我还是信不过我,都要自己跑一下看看,同时欢迎纠错)先说说啥是协程:协同程序是一个非常让 ...

  4. C++的最佳特性(译)

    最近看到了很多优秀的文章,包括<Why mobile web apps are slow>,实在忍不住翻译出来跟大家分享.这篇文章通过大量的实验和参考文献向我们说明移动应用开发所遇到的问题 ...

  5. 如何使用DDMS Heap查看Android应用内存情况

    作为大四毕业生,而且还是二本,加上技术基础不咋样,找工作自然也是辛酸得很...最糟糕的情况就是一开始实在是太小看了求职之路的艰辛,整个9月都是无所事事的度过,直到月底面试腾讯被鄙视后才顿然醒悟,意识到 ...

  6. 【原创】网站抓包HttpWebRequest不返回Javascript生成的Cookie的解决办法

    前言: 最近在做中国移动爬虫的过程中,首先遇到的就是 在某个请求中,有一个名为“WT_PFC"的cookie键值是由前端JavaScript生成的,没有进入到HttpWebResponse中 ...

  7. 使用Windows PE的U盘安装win7

    前年刚去公司的时候用PE装过好多系统,最近又装一台华硕的,碰到了一个问题,一起记录了下. 华硕X45,Bios已经改为U盘启动了,但就是进不去,因为知道可能还有个选磁盘启动项的键,找了半天原来按Esc ...

  8. Winform调用QQ发信息并且开机启动 (开源)

    前言 公司CS系统需要加入启动qq从winform调用qq聊天窗口的功能,前提是需要将聊天者的QQ号码作为参数传递到函数中,一直没有搞过,正好很感兴趣,就折腾,Winform调用qq,我想肯定是需要一 ...

  9. C# Web Forms - Using jQuery FullCalendar

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> ...

  10. bootstrap 学习片段

    1. 只要单击按钮添加了data-toggle="dropdown"属性, 在单击按钮的时候,默认隐藏的下拉列表就会显示出来 <div class="row&quo ...