一 成员变量 介绍
1 dispatcher 线程 调度器:
2
@get:JvmName("connectionPool") val connectionPool: ConnectionPool = builder.connectionPool 连接池
作用: 同类对象的批量管理,连接池 可以存储 一批的链接 ,当需要一个连接的时候 不是去创建的,而是连接池里 有没有一个链接可用的,有的话就直接拿走,没有的话 自己创建 或者让连接池 创建,当有一个连接 用完了,不直接 销毁 而是 放在 连接池 里等待稍后使用,如果闲置的链接 等待时间比较长,还没被拿走,那么 他可能会被销毁 ,,看连接池的配置。
池的工作模式:通过批量管理对象 重用和自动回收 追求性能和资源占用的动态平衡。 这个连接池 就是okhttp管理链接的工具
3 interceptors 是 Interceptor 的list :⼤多数时候使⽤的 Interceptor 都应该配置到这⾥。
@get:JvmName("interceptors") val interceptors: List<Interceptor> = builder.interceptors.toImmutableList()
4 networkInterceptors 和 3 的类型是一样的
作用: 直接和⽹络请求交互 的 Interceptor 配置到这⾥,例如如果你想查看返回的 301 报⽂或者未解压 的 Response Body,需要在这⾥看。
@get:JvmName("networkInterceptors") val networkInterceptors: List<Interceptor> =builder.networkInterceptors.toImmutableList()
5 eventListenerFactory 他是各种事件监听器的 工厂
@get:JvmName("eventListenerFactory") val eventListenerFactory: EventListener.Factory = builder.eventListenerFactory
6 retryOnConnectionFailure 链接失败,请求失败 是否重试的标志 为true okhttp会自动重试
@get:JvmName("retryOnConnectionFailure") val retryOnConnectionFailure: Boolean =builder.retryOnConnectionFailure
7 authenticator 自动进行 认证 修正 的工具
@get:JvmName("authenticator") val authenticator: Authenticator = builder.authenticator
背景 我们有些东西 需要先登录再使用,有token了再使用,但是token 是有有效期 的,有效期到了之后 我们需要使用refreshToken 去刷新token 而我们是通过返回的401 才知道 token过期了的,过了有效期后我们可以通过Authenticator 进行 token的刷新,,这些对用户是无感知的 以为一直登录的 使用如下
var client: OkHttpClient = OkHttpClient.Builder().authenticator(object : Authenticator{
override fun authenticate(route: Route?, response: Response): Request? {
TODO("Not yet implemented")
// 1把token刷新 通过自家后台获取新的
// 2然后再一次进行请求之前请求出错的 ,把新的token传进去
return response.request.newBuilder()
.header("Authorization","Bearer ndnndnd").build()
}
}).build();
var request: Request = Request.Builder()
.url("")
.build();
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
TODO("Not yet implemented")
}
override fun onResponse(call: Call, response: Response) {
TODO("Not yet implemented")
}
})
8 followRedirects 也是个开关 :是否跟着重定向 当服务器要求你重定向的时候,你要不要去重定向
@get:JvmName("followRedirects") val followRedirects: Boolean = builder.followRedirects
9 followSslRedirects 是 在 followRedirects这个开关打开的前提下,,当你重定向的时候 发生了协议切换的时候,要不要依然重定向,,比如 一开始进行了http请求 重定向到了https 还要不要继续重定向
@get:JvmName("followSslRedirects") val followSslRedirects: Boolean = builder.followSslRedirects
10 cookieJar 是存放cookie的存储器 okhttp是默认没给实现的 平时也很少用到
@get:JvmName("cookieJar") val cookieJar: CookieJar = builder.cookieJar
11 cache 做缓存
@get:JvmName("cache") val cache: Cache? = builder.cache
12 dns 域名系统 把域名解析成ip地址的
@get:JvmName("dns") val dns: Dns = builder.dns
Dns类里是通过 原生的方法 根据域名解析 ip地址的 : InetAddress.getAllByName(hostname).toList()
13 proxy : 代理 是否使用代理服务器去请求,,比如你想向A服务器发请求,,你先向B发了请求 让B服务器给A服务器发请求, 然后A会把返回值 返回给B B再返回给你 这个B就是代理服务器
@get:JvmName("proxy") val proxy: Proxy? = builder.proxy
代理有三种类型Proxy 类里有
public enum Type {
/**
* Represents a direct connection, or the absence of a proxy. 直连
*/
DIRECT,
/**
* Represents proxy for high level protocols such as HTTP or FTP.
*/
HTTP,
/**
* Represents a SOCKS (V4 or V5) proxy.
*/
SOCKS
};
14 由于 13 proxy 默认是none 没有设定 哪种代理类型 那么需要从 下边这个参数里获取
@get:JvmName("proxySelector") val proxySelector: ProxySelector =
when {
// Defer calls to ProxySelector.getDefault() because it can throw a SecurityException.
builder.proxy != null -> NullProxySelector
else -> builder.proxySelector ?: ProxySelector.getDefault() ?: NullProxySelector
}
ProxySelector里有个判断选中代理的方法: public abstract List<Proxy> select(URI uri); 会返回一个 Proxy的list okhttp在尝试建立连接的过程中 会首先判断 参数13 proxy是否有值,如果没有会遍历ProxySelector的select 方法 ,,,,,ProxySelector的默认值 在 上边的when里 不为null返回个啥 为null 返回个啥 其中 NullProxySelector默认实现里创建个Proxy里默认类型是直连
15 proxyAuthenticator : 如果这个代理 不能直接用 需要授权 才能使用 那么 这个proxyAuthenticator 就是处理 授权过期的
@get:JvmName("proxyAuthenticator") val proxyAuthenticator: Authenticator =builder.proxyAuthenticator
16 socketFactory : http请求 本质上是个连接 JAVA socket socket 是用 socketFactory创建的
@get:JvmName("socketFactory") val socketFactory: SocketFactory = builder.socketFactory
19 sslSocketFactory 我们在加密通信的时候 需要在 tcp连接上再键一个 加密连接 也就是 TLS连接 或者说SSl连接 加密连接就是通过 sslSocketFactory 创建的
private val sslSocketFactoryOrNull: SSLSocketFactory?
@get:JvmName("sslSocketFactory") val sslSocketFactory: SSLSocketFactory
get() = sslSocketFactoryOrNull ?: throw IllegalStateException("CLEARTEXT-only client")
20 x509TrustManager : 证书的验证器 :Https建立连接的时候 服务器会发过来证书 ,我们需要验证证书的合法性 是靠证书签发机构 是否在我的证书可信列表里 , 什么根证书的合法性 这些验证证书的工作就是 x509TrustManager做的
@get:JvmName("x509TrustManager") val x509TrustManager: X509TrustManager?
21 connectionSpecs 是个连接标准 连接规范 :
之前介绍的 建立 连接前 客户端 需要给服务器 发送 自己支持的TLS的版本啊 加密套件啊 非对称 对称 hash算法 都在这个类里
@get:JvmName("connectionSpecs") val connectionSpecs: List<ConnectionSpec> =
builder.connectionSpecs
22 protocols : 你支持http协议的版本号
@get:JvmName("protocols") val protocols: List<Protocol> = builder.protocols
23 这三个跟证书验证相关的 :CertificateChainCleaner 操作员 操作 x509TrustManager 验证 证书的合法性
还得验证 是不是我想要访问的那个网站的证书:hostnameVerifier靠他来验证
certificatePinner :
@get:JvmName("hostnameVerifier") val hostnameVerifier: HostnameVerifier = builder.hostnameVerifier
@get:JvmName("certificatePinner") val certificatePinner: CertificatePinner
@get:JvmName("certificateChainCleaner") val certificateChainCleaner: CertificateChainCleaner?
24 hostnameVerifier :⽤于验证 HTTPS 握⼿过程中下载到的证书所属者是否和⾃⼰要访问的主机名⼀致。