1. 基础知识
  2. HTTP基础知识(状态码,请求方法,请求头,cookies)
  3. socket/webSocket
  4. 系统请求库和开源请求库
  5. 缓存系统(LRU LFU)
  6. 应用场景:文件上传,断点续传,加密和签名。
  7. 特殊请求:流媒体协议,IM长连接

系统库

以前是NSURLConnection,现在已经改版成NSURLSession为核心了。架构如图:

即session控制多个请求,每个请求对应为一个SessionTask,然后使用SessionConfiguration来配置session的性质。

task有4种:dataTask,downloadTask,streamTask,然后uploadTask继承于dataTask。

构建task之后通过resume方法开启,然后通过session的delegate方法回调处理请求的种种状况。

1. session构建
  • 自建还是用share
  • config的配置细节,不用default奔溃
2. 权限验证

HTTPS知识

  • App Transport Security (ATS)

验证服务器的证书正确性:

//默认是让系统做默认处理
NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;NSURLCredential *credential = nil;if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {SecTrustRef secTrust = challenge.protectionSpace.serverTrust;SecTrustResultType result = 0;SecTrustEvaluate(secTrust, &result);if (result == kSecTrustResultProceed ||result == kSecTrustResultUnspecified) {credential = [[NSURLCredential alloc] initWithTrust:secTrust];//只有证书验证通过并且构建成功时信任证书if (credential) {disposition = NSURLSessionAuthChallengeUseCredential;}}else{//证书验证失败,取消信任disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;}}completionHandler(disposition, credential);
复制代码

证书分为从CA签发的证书跟自建证书两种,证书都是一级级签发的,形成一个证书链。从CA签发的证书和自建证书的区别就是前者的根证书是公开已知的,操作系统在安装过程中会默认安装一些受信任的CA机构的根证书,所以如果是第一张,系统自身就可以完成这个验证过程。

如果是自己签发的证书,系统是不认识的,要自定义认证过程。这部分可参考AFNetWorking的处理:

//替换为自己本地指定的证书
SecTrustSetAnchorCertificates(serverTrust, (__bridge CFArrayRef)pinnedCertificates);
//验证证书
if (!AFServerTrustIsValid(serverTrust)) {return NO;
}
复制代码
3. 接收数据3件套

didReceiveResponse: didReceiveData: didCompleteWithError:

4. downloadTask
  • 它会把返回内容下入到一个临时文件里,结束的回调里提供这个文件地址
  • 支持断点续传操作:
[downloadTask cancelByProducingResumeData:^(NSData * _Nullable resumeData) {//使用这个方法取消,获取到用于重启的数据,保存下来}];...//之后使用这个resumeData重新构建下载任务NSURLSessionDownloadTask *downloadTask = [session downloadTaskWithResumeData:resumeData];
复制代码

从这两个特性可知:downloadTask是用来应对大的文件传输的,在这种应用环境下可考虑使用。

设计上,使用resumeData就可以重启下载,说明这个数据里至少保存了URL信息,所以猜测它的设计里,这个数据可能并不是下载的数据,而是一系列的描述信息,如URL、证书认证、之前下载的文件地址、已下载字节大小等。

可惜这里是不透明的NSData类型,断点续传的功能完全可以自己设计,还可以更好的控制下载文件位置、缓存、数据模型等。比如超级大图要求下载一部分就立马显示出来,这种需求就需要在过程中就获取数据,而这里downloadTask的delegate方法只是提供了数据大小却没有提供数据位置。

断点续传的实现

  • 请求头加入Range,如Range:0-2000
  • 返回头会相应的填入Content-Range:0-1000/24304,表示返回的返回和总大小。
  • 考虑到文件可能被修改,可加入If-Range,值为文件的标识(Etag)或者Last-Modified的值,服务端根据这个值判断文件是否修改了,未修改,返回指定的部分数据(206),已修改,返回整体数据(200)。
5. uploadTask和文件上传协议

使用系统的上传方法:

uploadTaskWith...系列有3个方法,抓包查看,使用uploadTaskWithRequest:fromFile:方法的请求类型为:Content-Type application/octet-stream,而另外两种为Content-Type application/x-www-form-urlencoded

对后台处理似乎没什么区别,都是从数据流里读取然后写入文件。系统的上传有很鸡肋:1. 没法同时传多个文件 2.没法同时传入其他的参数。

如果你要做这些,就要自己去构建request,那么这个uploadTask其实已经没什么作用了,就是其他类型的task照样能完成任务。

自定义上传方式:如果要解决掉上面说的两个缺点,要使用multipart/form-data的方式,具体参考iOS里实现multipart/form-data格式上传文件,或者直接使用第三方库,AFNetWorking内部就是使用这种方式上传文件。

6. 断点续传
  • 使用Accept-Ranges判断后台是否支持断点续传,支持时值为bytes,不支持为none
  • 客户端请求时设置Range:bytes=20-150来指定请求的数据范围,bytes是单位,注意这个开始结束的索引是从0开始算的,然后10-表示从10到结束所有内容。
  • 服务端返回时,使用Content-Range:bytes10-200/1340,10为开始,200为结束,1340为总长度。
  • 返回时还要修改:1. http状态码为206(部分数据) 2.Content-Length要修改为部分数据的长度,而不是总长度,否则客户端会一直等待数据传完,但实际已经结束,最后会导致超时错误。

断点续传还有一个好处是可以多线程下载数据,把大文件切割为多个部分,分多个线程分别请求,然后在本地拼接。

7. 缓存系统(LRU LFU)

参考缓存策略之LRU和LFU

【重读iOS】网络请求2:应用相关推荐

  1. 吕文翰 php,自己动手写一个 iOS 网络请求库(三)——降低耦合

    自己动手写一个 iOS 网络请求库(三)--降低耦合 2015-5-22 / 阅读数:16112 / 分类: iOS & Swift 本文中,我们将一起降低之前代码的耦合度,并使用适配器模式实 ...

  2. 最简单的iOS网络请求

    为什么80%的码农都做不了架构师?>>>    做iOS开发,说到网络请求,大家可能都不约而同的提到AFN,可以说大家的网络请求都是用AFN封装而成,AFN的强大易用的确很好. 但是 ...

  3. iOS网络请求安全(JWT,RSA)

    在网络世界中,安全是一个很重要的问题,以往的HTTP请求已经不能承担这个安全任务,抓包工具一抓,你的所有网络请求全都曝光.当然,你可能会采用加密算法来加密数据,但是这仍然不够. 在移动端和服务器的通信 ...

  4. iOS网络请求安全认证(JWT,RSA)

    在网络世界中,安全是一个很重要的问题,以往的HTTP请求已经不能承担这个安全任务,抓包工具一抓,你的所有网络请求全都曝光.当然,你可能会采用加密算法来加密数据,但是这仍然不够. 在移动端和服务器的通信 ...

  5. iOS网络请求认证挑战

    一.引言 Http请求中认证挑战相关的代理如下: 1.将要发送一个认证挑战的请求 - connection:willSendRequestForAuthenticationChallenge: 2.是 ...

  6. iOS 网络请求劫持

    1.概述: NSURLProtocol是URL loading system 中的一个重要的组成部分,它允许我们对全局的网络请求(基于使用URLRequest)做拦截,可拦截的请求类型有NSURLCo ...

  7. iOS网络请求错误nw_proxy_resolver_create_parsed_array PAC evaluation error: NSURLErrorDomain: -1004

    在发起一个网络请求时,出现错误 nw_proxy_resolver_create_parsed_array PAC evaluation error: NSURLErrorDomain: -1004 ...

  8. ios开发循环网络请求_GitHub - JadenTeng/ResourceX: iOS网络请求,网络泛型编程,工具类的封装,基于AFNetworking 实现, NSCache数据缓存...

    ResourceX 通过AFNetworking.YYModel 解析网络泛型编程简化网络请求 现如今,网络通信几乎涉及每一个app程序.对于绝大多数请求HTTP API的方法,它们的执行流程都可以分 ...

  9. iOS ---网络请求封装(自动缓存与手动缓存)

    #import <Foundation/Foundation.h> @interface WNetworkCache : NSObject /** *  手动写入/更新缓存 * *  @p ...

  10. php后台和ios网络请求,iOS网络 POST通过JSON传数据到后台

    后台php脚本代码 header('Content-Type:text/plain;charset=utf-8'); $json = file_get_contents('php://input'); ...

最新文章

  1. 深度学习目标检测指南:如何过滤不感兴趣的分类及添加新分类?
  2. c语言嵌入式开发单片机,嵌入式开发|单片机基础
  3. 《编写高质量代码:改善c程序代码的125个建议》——建议4-1:整数转换为新类型时必须做范围检查...
  4. 基于消息队列的分布式事务解决方案
  5. 深度学习和目标检测系列教程 8-300:目标检测常见的标注工具LabelImg和将xml文件提取图像信息
  6. HarmonyOS之AI能力·图像超分辨率
  7. Windows Mobile系列手机操作系统
  8. 最新的Windows phone Developer tools RTW 发布了
  9. RESTful  Web APIs设计风格
  10. 实现.NET Core配置Provider之EF
  11. jsp+左间距_DIV间距设置
  12. 有下界的最小费用可行流2.0(bzoj 3876: [Ahoi2014]支线剧情)
  13. WCDMA为什么上行是干扰受限,下行是功率受限
  14. 戴尔修复计算机软件,DELL电脑系统恢复工具(Dell OS Recovery Tool)2019 v2.3.6066官方版...
  15. 各位大佬,别再拿人工智能当春药了!
  16. 问题:计算给定年月日的日期是星期几(泽勒一致性)
  17. 阳光房市场深度研究分析报告
  18. 北京航空航天大学、浙江大学等27支海内外高校队伍晋级ASC超算大赛总决赛
  19. [CareerCup] 9.8 Represent N Cents 组成N分钱
  20. 昨天申请了三丰云免费云服务器,体验不错

热门文章

  1. JS BOM之location.hash详解
  2. IUSR_ 计算机名和IWAM_ 计算机名帐户的用户名和密码
  3. Notepad2 一个很不错的记事本
  4. 《Pro SQL Server Internals》部分翻译(P155-165)
  5. 在C#中用COM操作CAD
  6. 在maven项目中使用Junit进行单元测试(一)
  7. Android应用程序键盘(Keyboard)消息处理机制分析(20)
  8. 【转】css行高line-height的一些深入理解及应用
  9. Java Web(11) Spring MVC 返回Json
  10. hitTest和pointInside如何响应用户点击事件