介绍

这是一篇关于URL和服务器通信标准互联网协议的指南,把这些类集合在一起Apple称之为URL Loading System

URL Loading System是一些协议和类的集合,在这个系统中我们的应用程序可以去访问URL所指向的内容。这其中核心技术的便是NSURL类,该类允许应用程序去操作URL地址和该地址所指向的资源。

为了支持这个类,Foundation框架提供了丰富的类簇,方便我们去执行许多网络相关的操作,包括去加载URL指定的内容资源,或者是向服务器上传数据,或者是管理Cookie的存储,或者是控制(HTTP、FTP等等)响应报文的缓存,抑或是以程序特定的方式来处理凭证(类似于安全验证的号牌之类的)和用户认证,还有编写自定义的协议扩展等等。

URL Loading System对以下协议访问相关资源提供了支持:

  • ftp://
  • http://
  • https://
  • file://
  • data://

除此之外还提供了对用户系统偏好设置中的代理服务器和SOCKS网关的支持。

✨✨✨重要

在Apple平台下,网络安全被称为App Transport Security(ATS),它适用于App和App的扩展(app extensions)。并且默认是可用的,它使用行业标准协议来实现应用程序的网络连接,而且为了提高隐私的安全性和数据的完整性要求相应的密码没有明显的弱点!!!更多消息详见NSAppTransportSecurity


提示

除了URL Loading System,OS X和iOS都提供了在其他应用程序中打开URL的API接口,比如Safari。在本书中并不会去描述这些API。

更多关于OS X中的启动服务,见Launch Services Programming Guide

更多关于OS X中使用NSWorkSpace类的openURL:方法的相关信息,见NSWorkspace

更多关于iOS中的UIApplication类的openURL:方法相关信息,见UIApplication

概览

URL Loading System包含了一些重要的辅助类,通过使用这些类可以修改URL加载相关的特定行为。这些辅助类主要分为5大类:

  • 协议支持(Protocol Support)
  • 身份验证和证书(Authentication and Credentials)
  • Cookie存储(Cookie Storage)
  • 配置管理(Configuration Management)
  • 缓存管理(Cache Management)

下面根据上面的图大体的来说一说每一个模块。为了能够明确是根据上图来得,所以这部分我会将英文原文的标题作为中文译本的标题。

URL Loading

在URL Loading中最常用的类(NSURLSession)允许应用程序从源中获取URL的内容,我们可以根据目的不同来指定不同的方法,比如获取数据到内存中,或者下载到磁盘中去。

获取内容数据(内存中)

在相对更高级的方法中,提供了两种获取URL数据的方法:

  • 对于简单的请求,使用NSURLSession类相关API可以直接获取NSURL对象的相关内容,这个内容可以是NSData对象也可以是一个磁盘文件。
  • 对于更加复杂的请求——上传数据的请求,提供一个NSURLRequest对象(或者其可变子类NSMutableURLRequest)给NSURLSession。

无论是选择哪种方法,我们的应用程序都可以使用以下两种方法来获取响应数据:

  • 提供了一个completion的block,URL Loading类会在完全接收了服务器数据之后调用该block。
  • 提供一个自定义的delegate,URL Loading类会在接收源数据时定期地调用delegate方法。如果需要的话,我们应该把这些数据都收集起来。

除了数据本身,URL Loading类通过使用completion block和delegate来传递的response对象封装了与请求相关联的元数据(metadata),比如MIME-Typecontent-length

文件下载

同样在相对更高级的方法中,也有两种基本的方法通过URL来下载文件,这两种方法和上面提到的一样(连官方文档的原文都是一模一样的,这里就不翻译了)。

👾👾👾 提示

使用NSURLSession对象下载的数据不会进行缓存。如果我们需要缓存数据的话,必须要在使用NSURLSession时将数据写入到磁盘中。

辅助类

URL Loading类使用两个辅助类来提供其他的元数据,其一是用于请求本身的NSURLRequest类,另一个是用于服务器的响应的NSURLResponse

URL请求(NSURLRequest)

通过与协议无关的方式(这里所说的协议应该是应用层协议,包括HTTP,HTTPS,SMTP之类的应用层协议),使用NSURLRequest对象来封装URL和任何协议特定的属性。也就是说不会因为协议的差异来定义多个request类,只定义一个NSURLRequest就可以了。

提示

当客户端app使用NSMutableURLRequest来发起一个因特网连接或者一个下载任务时,会触发深拷贝(deep copy)。也就是说在请求发起之后,如果想要对该请求进行更改的话是无效的。

一些协议支持协议特定属性(这句话什么鬼🤕,我自己的话来理解就是支持对协议特定值的修改)。比如在HTTP协议中向NSURLRequest添加方法,然后会返回HTTP的请求实体和请求头等等。同样也可以向NSMutableURLRequest中添加方法来设置这些值(比如http请求头的值,像content-length, user-agent, mime-type之类的)。在后面会详细介绍URL请求对象的相关信息。

响应元数据(NSURLResponse)

服务器的响应数据可以分为两个部分:描述(响应)内容的元数据和内容数据本身。大多数协议的元数据都是由NSURLResponse类封装的,包括了MIME-Type,预期的内容长度(expected content length)(这在计算下载进行进度时作为分母使用),文字的编码方式以及响应的URL。由于协议的不同,针对不同的协议提供了不同的NSURLResponse子类来提供额外的元数据,比如NSHTTPURLResponse,它存储了Web服务器返回的请求头和状态码(比如1xx,2xx,3xx,4xx,5xx)。

重要

1、只有响应的元数据是存储在NSURLResponse对象中的。

2、各个URL Loading类都提供了completion的回调和协议代理来把响应数据本身传递给应用程序。

3、一个NSCachedURLResponse对象包含了NSURLResponse对象,URL的内容数据,以及一些其他信息。

重定向以及请求修改

一些协议,比如HTTP提供了一个服务器会告诉客户端相关的内容已经被移动到不同的URL中的方法。URL Loading类会在这个情况发生的时候告知它的代理,如果我们的程序提供了适当的代理方法,那么我们的程序可以决定是否遵循这相关的重定向,或者从重定向返回的响应数据正文,或者返回错误给我们。

身份验证和证书(Authentication and Credentials)

一些服务器会限制(restricted)我们对其资源的访问。若要继续访问的话,则需要用户提供某种凭据来进行身份验证以便获得这些内容的访问权限,凭证常见的有客户端证书、用户名和密码等等。证书有多方面的作用,其一是如果我们要访问在Web服务器中被集中在一起的资源,它要求我们提供一套相关的证书(我对于Web Server了解的很少,翻译得可能有点儿问题);其二证书也可用于我们app来评估是否信任该服务器。

URL Loading System提供了安全持久化模型的凭证和保护区域的相关类(下面会提到的NSURLProtectionSpace),在应用程序启动期间,我们可以指定这些证书持续地存在于某个请求中,或者长久地保存在用户的keychain中

提示

被存储在用户的keychain中的证书是会被所有的app共享的。

NSURLCredential类包括了认证信息(例如用户名和密码)组成的凭证,以及一些持久性的东西。NSURLProtectionSpace类代表需要特定的凭证的区域,一个保护区可以限于单个URL,或是Web服务器的一个区域,或是涉及的一个代理(服务器)。

NSURLCredentialStorage对象管理着一个session凭证的存储,并且可以将NSURLCredential对象映射到相应的(提供了身份认证)NSURLProtectionSpace对象,只有身份认证成功才会进行凭证的存储。

NSURLAuthenticationChallenge类封装了NSURLProtocol实现认证请求所需要的信息,包括:建议使用的证书,涉及的保护区域,用于确定协议必需的用户认证和相关地响应,或者错误信息,以及尝试进行身份验证的次数。NSURLAuthenticationChallenge实例还可以指定启动了身份验证的对象。这个初始对象(称为发送方)必须遵守NSURLAuthenticationChallengeSender协议。

NSURLAuthenticationChallenge实例通过NSURLProtocol的子类(通常我们都会自己子类化NSURLProtocol)告知URL Loading System必须要进行身份认证。它们同样提供了NSURLSession的代理方法,以便我们去自定义处理身份认证相关的操作。

缓存管理

URL Loading System提供了磁盘缓存和内存缓存两种方式,以减少我们app对于网络连接的依赖,根据先前缓存的响应内容来减少请求的往返时间(往返时间:在tcp中指的是从一个报文段发出到它被确认的时间,判断是否被确认是根据tcp报文段中的确认号)。这些缓存是以每个app来存储的。使用NSURLSession来查询缓存是根据NSURLRequestNSURLSessionConfiguration对象指定的缓存策略。

NSURLCache类提供了配置缓存大小的方法,这个缓存存储在磁盘中。该类还提供了用于管理NSCachedURLResponse对象(包含了缓存的响应内容的对象)集合的方法。

NSCachedURLResponse对象封装了NSURLResponse对象和URL指定的数据,它还提供了用户信息字段(userinfo),并且我们app可用它来缓存任何自定义的数据。

并不是所有的协议实现都支持响应缓存,当前就只有用http和https请求时会进行缓存。

NSURLSession对象可以控制响应数据是否已经被缓存,或者响应数据是否应该被缓存。具体的方法是实现URLSession:dataTask:willCacheResponse:completionHandler:代理方法。

Cookie存储

由于HTTP是无状态协议,客户端经常使用Cookie来持久存储跨URL请求的数据。URL Loading System提供了创建和管理cookies的接口,把发送cookies作为http请求的一部分,并在解析(interpreting)Web服务器的响应时接收cookies。

OS X和iOS都提供了NSHTTPCookieStorage类,并且提供用于管理NSHTTPCookie对象集合的接口。在OS X中存储的cookie是跨所有app共享的;在iOS中,cookie是根据每个app自身来存储(并不是所有app所共享)。

协议支持

URL Loading System支持http, https, file, ftpdata协议。除此之外URL Loading System还允许我们应用程序注册自己的类来支持其他应用层网络协议。我们可以向URL的请求和响应中添加特定的协议属性(也就是前面说过的请求头之类的)。

results matching ""

    No results matching ""