前面说到OkHttp网络请求的总体框架。这一章节主要通过解读OkHttpClient的内容,了解可以通过框架配置哪些参数,以及这些参数的意义。让我们对OkHttp框架和HTTP协议之间的关系有更深的了解。
接下来按照OkHttpClient类中变量定义的顺序,逐一进行介绍。
connectionPoll
连接池。池是对同类对象的批量管理。一个连接使用完,先不立即进行释放,而是先放到“池”中。当需要一个连接时,不直接进行创建,而是先到连接池里进行查询,看是否有用的连接,如果有则进行复用,否则再创建新的连接。以此来减少需要创建重复连接的开销。
连接池,通过重用和自动回收来追求性能和资源占用的平衡。在连接池中的连接,根据具体的配置,在指定时长内没有被使用,则会自动进行释放。
关于复用,HTTP1和HTTP2有不同的方式。对于HTTP1需要被释放的、指向同一主机的连接才能进行复用。HTTP2支持多路复用,正在使用的连接也可以进行复用。
eventListenerFactory
网络事件监听器。通过设置监听器,可以知道网络访问各个阶段的状态,如连接建立、连接失败、重试、请求返回等。
retryOnConnectionFailure
连接失败时是否进行重试的开关。这个开关默认是打开的状态。在有些情形下,连接失败时,会进行重试。如果开关关闭,则不会进行重试。关于“重试”后面拦截器部分会详细进行讲解。
authenticator
用于鉴权的自动修正。我们知道HTTP请求中,会存在token过期,需要被刷新的问题。Authenticator会在token失效时,比如401错误,自动帮我们进行刷新。对这块不了解的,可以看下我前面关于介绍HTTP协议的文章。
followRedirects
是否进行重定向开关。当服务器返回需要重定向时,在该开关打开时,会按照服务器返回的重定向地址自动进行重定向。若该开关为false,则直接将请求结果返回给客户端。该开关默认是打开状态。
cookieJar
直译过来就是“装饼干的罐子”。
这个是用来存放Cookie的容器。OkHttp默认没有提供支持,返回是“空“”的容器。需要用户自己进行实现,将网站的Cookie存放在内存或什么位置。
cache
用于存放服务器返回响应的缓存数据。在有些情况下,如指定时间内,服务器返回的内容没有发生变化,则可以直接使用缓存的数据。减少网络请求的开销。
dns
进行域名解析的工具。使用它可以完成将域名解析成为IP地址。
它的核心方法“getAllByName”实际上是一个java的原生方法,接受一个域名参数,返回一组ip地址(一个域名可能对应多个ip地址)。我们可以直接使用这个java方法对域名进行ip地址查询。
proxy
用于配置代理服务器。作用是配置代理服务器后,客户端向代理服务器发起请求,由代理服务器代为向目标服务器发起请求。请求的结果也由代理服务器返回给客户端。
使用代理访问的场景主要有两种场景:1、管理者进行网络管制,某个网络里的所有主机都被限制了与外网直接联系,用户需要访问外部网络,需要经由固定的代理,有代理服务器筛选后发起网络请求;2、某个主机被限制了访问服务器,则可以经由代理发起请求,绕过访问限制。
proxySelector
代理类型选择器。类型有三种DIRECT、HTTP和SOCKS。默认是不使用代理,即是DIRECT类型,表示直连。
proxyAuthenticator
作用和前面的authenticator是一样的,proxyAuthenticator是用来处理代理服务器token失效的情况。
socketFactory
HTTP是使用Socket进行连接,就是用socketFactory进行创建。
sslSocketFactory
这个是创建专门用来给HTTPS用的带加密通讯的socket。
x509TrustManager
用于HTTPS通讯中,进行证书认证的工具。X509是一种证书的格式。现在所有的证书都是用的这种格式。
connectionSpecs
进行HTTPS连接时,客户端所支持的哪些TLS版本。
OkHttp中提供三套可供选择,从上到下的限制从严格到宽松。兼容性从弱到强。最下面的CLEARTEXT表示“明文”,表示不使用加密,即使用HTTP。
protocols
HTTP协议版本号。主要有HTTP1.0、HTTP1.1、SPDY_3、HTTP2、H2_PRIOR_KNOWLEDGE。
SPDY_3是HTTP2的前身。它是在HTTP1.x的基础上进行尝试的试验性协议,SPDY_3开发完了之后被贡献出来,被业界所接受形成新的协议,就是现在的HTTP2。SPDY_3现在已被废弃。
H2_PRIOR_KNOWLEDGE理解为是HTTP2的不加密版本。HTTP2默认是使用TLS加密传输。用明文方式传输就是H2_PRIOR_KNOWLEDGE。
hostnameVerifier
用于主机名验证的工具。我们知道在HTTPS通讯中除了验证证书的合法性,为防止来自恶意主机的合法证书,需要同时对主机名进行验证。
certificatePinner
表示“把证书订上”。有时为了更高级别的安全防护,客户端会记录某个证书的hash值,在进行证书验证时,不仅需要证书是合法的,还需要是“我”所指定的证书。
正常请求中建议不要使用。这样会导致,在服务器换了签名机构后,由于签名证书改变而无法进行请求访问。
certificateChainCleaner
这个是表示“证书链”的数据结构。我们知道服务器发来验证的证书,往往是一个证书链,签名机构给服务器证书签名,又要有签名机构给签名机构签名,递归的终点是内置在设备的根证书。证书链的第一个证书就是目标服务器的证书。
超时配置
进行一些超时配置,如请求超时、连接超时、读/写数据超时,HTTP2心跳包间隔等等。
到此我们理完了OkHttp关于网络请求的配置参数。可以看到这里基本上用到了我们前面讲的HTTP协议和HTTPS相关的内容。