iOS 网络编程 | 青训营笔记

253 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第17天

C/S 模式

C 是指 Client,S 是指 Server,C/S 模式就是指客户端/服务器模式,是计算机软件协同工作的一种模式,通常采取两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务

在一次 Http 请求的行为中, 发起请求的是客户端、做出响应的是服务器。其实一些场景下客户端也可能作为服务器(比如消息推送,长链接指令,点对点通信)

Http 请求

Http 协议的特点是, 基于 TCP/IP、 无状态、无连接、CS 模式。 支持 keep-alive、Https 等特性,支持的方法有 Post、Get、Put 等

一次Http请求过程中发生的事情

  1. DNS 域名解析
  2. 建立 TCP 链接
  3. 发送 HTTP 请求(Headers, Body)
  4. 服务器处理请求,并响应
  5. 客户端收到响应并处理

Http 报文

Http 报文由三部分组成,分别是请求行、请求头部、请求的数据,大致上分别对应 NSURLNSURLRequest.headersNSURLRequest.HTTPBody

iOS 网络库-NSURLSession

大部分语言都会封装一个网络库(或者工具)来让用户更快速地使用, 比如 shell 里的 curl, python里的 requests,js 里的 axios

NSURL

NSURL,其实就是帮我们解析了 URL 字符串各个部分的对象。

统一资源定位符(英语:Uniform Resource Locator,缩写:URL,或称统一资源定位器、定位地址、URL地址)俗称网页地址,简称网址。 URL其实就是一个有特定格式的字符串

NSURLRequest

在 NSURLRequest 里我们会设置一些 Http 报文中的内容,比如方法、URL、http头

NSURLSession

NSURLSessioniOS7 中推出,NSURLSession 的推出旨在替换之前的 NSURLConnectionNSURLSession 的使用相对于之前的 NSURLConnection 更简单,而且不用处理 Runloop 相关的东西

2015年 RFC 7540 标准发布了 http 2.0 版本,http 2.0 版本中包含很多新的特性,在传输速度上也有很明显的提升。NSURLSessioniOS9.0 开始,对 http 2.0 提供了支持

NSURLSession 由三部分构成:

  • NSURLSession:请求会话对象,可以用系统提供的单例对象,也可以自己创建
  • NSURLSessionConfiguration:对 session 会话进行配置,一般都采用 default
  • NSURLSessionTask:负责执行具体请求的 task,由 session 创建

NSURLSessionConfiguration

NSURLSessionConfiguration 负责对 NSURLSession 初始化时进行配置,通过NSURLSessionConfiguration 可以设置请求的 Cookie、密钥、缓存、请求头等参数,将网络请求的一些配置参数从 NSURLSession 中分离出来。

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config
                                                      delegate:self
                                                 delegateQueue:[NSOperationQueue mainQueue]];

NSURLSessionTask

通过 NSURLSession 发起的每个请求,都会被封装为一个 NSURLSessionTask 任务,但一般不会直接是 NSURLSessionTask 类,而是基于不同任务类型,被封装为其对应的子类

  • NSURLSessionDataTask:处理普通 Get、`Post请求
  • NSURLSessionUploadTask:处理上传请求,可以传入对应的上传文件或路径
  • NSURLSessionDownloadTask:处理下载地址,提供断点续传功能的 cancel 方法

NSURLSessionDelegate

对于 NSURLSession 的代理方法这里就不详细列举了,方法命名遵循苹果一贯见名知义的原则,用起来很简单。这里介绍一下 NSURLSession 的代理继承结构

NSURLSession 中定义了一系列代理,并遵循上面的继承关系。根据继承关系和代理方法的声明,如果执行某项任务,只需要遵守其中的某个代理即可

例如执行上传或普通 Post 请求,则遵守 NSURLSessionDataDelegate,执行下载任务则遵循 NSURLSessionDownloadDelegate,父级代理定义的都是公共方法