这是我参与「第四届青训营 」笔记创作活动的第17天
C/S 模式
C 是指 Client,S 是指 Server,C/S 模式就是指客户端/服务器模式,是计算机软件协同工作的一种模式,通常采取两层结构,服务器负责数据的管理,客户机负责完成与用户的交互任务
在一次 Http 请求的行为中, 发起请求的是客户端、做出响应的是服务器。其实一些场景下客户端也可能作为服务器(比如消息推送,长链接指令,点对点通信)
Http 请求
Http 协议的特点是, 基于 TCP/IP、 无状态、无连接、CS 模式。 支持 keep-alive、Https 等特性,支持的方法有 Post、Get、Put 等
一次Http请求过程中发生的事情
- DNS 域名解析
- 建立 TCP 链接
- 发送 HTTP 请求(Headers, Body)
- 服务器处理请求,并响应
- 客户端收到响应并处理
Http 报文
Http 报文由三部分组成,分别是请求行、请求头部、请求的数据,大致上分别对应 NSURL、NSURLRequest.headers、NSURLRequest.HTTPBody
iOS 网络库-NSURLSession
大部分语言都会封装一个网络库(或者工具)来让用户更快速地使用, 比如 shell 里的 curl, python里的 requests,js 里的 axios
NSURL
NSURL,其实就是帮我们解析了 URL 字符串各个部分的对象。
统一资源定位符(英语:Uniform Resource Locator,缩写:URL,或称统一资源定位器、定位地址、URL地址)俗称网页地址,简称网址。 URL其实就是一个有特定格式的字符串
NSURLRequest
在 NSURLRequest 里我们会设置一些 Http 报文中的内容,比如方法、URL、http头
NSURLSession
NSURLSession 在 iOS7 中推出,NSURLSession 的推出旨在替换之前的 NSURLConnection,NSURLSession 的使用相对于之前的 NSURLConnection 更简单,而且不用处理 Runloop 相关的东西
2015年 RFC 7540 标准发布了 http 2.0 版本,http 2.0 版本中包含很多新的特性,在传输速度上也有很明显的提升。NSURLSession 从 iOS9.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,父级代理定义的都是公共方法