zoukankan      html  css  js  c++  java
  • iOS开发笔记4:HTTP网络通信及网络编程

        这一篇主要总结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提供的方法:

     

  • 相关阅读:
    前后端分离
    Do a “git export” (like “svn export”)?(转)
    最有价值的信息就是这样的信息:大象是绳子,大象是扇子,大象是柱子…… 这样的信息往往是扭曲的,残缺的,隐晦不明的(转)
    说服他。说不服再按着他的去办(转)
    动手学习TCP:数据传输(转)
    应用程序框架实战十三:DDD分层架构之我见(转)
    UVA11627-Slalom(二分法)
    数据库系统原理及其应用总结---ShinePans
    cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&主角加入动作
    Android学习四、Android中的Adapter
  • 原文地址:https://www.cnblogs.com/colinhou/p/4542433.html
Copyright © 2011-2022 走看看