Okhttp 源码解析 二 之 OkHttpClient

一 成员变量  介绍 

1  dispatcher    线程 调度器:

⽤于调度后台发起的⽹络请求, 有后台总请求数单主机总请求数的控制

@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 握⼿过程中下载到的证书所属者是否和⾃⼰要访问的主机名⼀致。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值