首页 > 编程知识 正文

okhttp请求线程池,vue3源码解析

时间:2023-05-03 07:05:09 阅读:33828 作者:2543

本文基于okhttp-3.14.9版本

对于OkHttp请求,必须初始化OkHttp客户端

可以在OkHttpClent.Builder中设置参数ok http client.builder builder=newokhttpclient.builder (; builder.connecttimeout(15,TimeUnit.SECONDS ); okhttpclientokhttpclient=builder.build (; 2 .使用默认参数,okhttpclientokhttpclient=newokhttpclient () publicclassokhttpclientimplementscloneable,Call.Factory

在new OkHttpClient.Builder ()中,您可以看到OkHttpClient的每个参数都可以在builder中设置。 build.build ) )完成的第二种情况是接受缺省参数

在new OkHttpClient ()、缺省或缺省OkHttpClient的内部类Builder中调用,调用每个参数publicclassokhttpclientimplementscloneable,call . web socket.factory { ok http客户端(builder builder ) this.dispatcher=builder.dispatcher; this.proxy=builder.proxy; this.protocols=builder.protocols; this.connection specs=builder.connection specs; this.interceptors=util.immutable list (builder.interceptors ); this.network interceptors=util.immutable list (builder.network interceptors ); this.eventlistenerfactory=builder.eventlistenerfactory; this.proxy selector=builder.proxy selector; this.cookie jar=builder.cookie jar; this.cache=builder.cache; this.internal cache=builder.internal cache; this.socket factory=builder.socket factory; 布尔型is TLS=false; 连接pecspec :连接specs ({ is TLS=is TLS|| spec.is TLS ); } if (builder.SSL套接字工厂!=空| |! is TLS ({ this.SSL socket factory=builder.SSL socket factory; this.certificatechaincleaner=builder.certificatechaincleaner; } else { x509 trustmanagertrustmanager=util.platformtrustmanager (; this.SSL socket factory=newsslsocketfactory (信任管理器); this.certificatechaincleaner=certificatechaincleaner.get (信任管理器); (if ) SSL套接字工厂!=null(platform.get ).configuresslsocketfactory (SSL套接字factory ); } this.hostname verifier=builder.hostname verifier; this.certificatepinner=builder.certificatepinner.withcertificatechaincleaner (certificatechaincleaner ); this.proxy authenticator=builder.proxy authenticator; this.authenticator=builder.authenticator; this.connection pool=builder.connection pool;

this.dns = builder.dns; this.followSslRedirects = builder.followSslRedirects; this.followRedirects = builder.followRedirects; this.retryOnConnectionFailure = builder.retryOnConnectionFailure; this.callTimeout = builder.callTimeout; this.connectTimeout = builder.connectTimeout; this.readTimeout = builder.readTimeout; this.writeTimeout = builder.writeTimeout; this.pingInterval = builder.pingInterval; if (interceptors.contains(null)) { throw new IllegalStateException("Null interceptor: " + interceptors); } if (networkInterceptors.contains(null)) { throw new IllegalStateException("Null network interceptor: " + networkInterceptors); } } public static final class Builder { public Builder() { dispatcher = new Dispatcher(); protocols = DEFAULT_PROTOCOLS; connectionSpecs = DEFAULT_CONNECTION_SPECS; eventListenerFactory = EventListener.factory(EventListener.NONE); proxySelector = ProxySelector.getDefault(); if (proxySelector == null) { proxySelector = new NullProxySelector(); } cookieJar = CookieJar.NO_COOKIES; socketFactory = SocketFactory.getDefault(); hostnameVerifier = OkHostnameVerifier.INSTANCE; certificatePinner = CertificatePinner.DEFAULT; proxyAuthenticator = Authenticator.NONE; authenticator = Authenticator.NONE; connectionPool = new ConnectionPool(); dns = Dns.SYSTEM; followSslRedirects = true; followRedirects = true; retryOnConnectionFailure = true; callTimeout = 0; connectTimeout = 10_000; readTimeout = 10_000; writeTimeout = 10_000; pingInterval = 0; } }}

OkHttpClient的默认参数来自OkHttpClient.Builder

Dispatcher 

    异步请求何时执行的策略,即调度器;内部含有一个线程池,用来执行所有的请求;执行的策略是刚进来的AsyncCall请求放在readyAsyncCalls的双端队列中;如果能够满足正在执行的请求数量小于最大请求数量(maxRequests),并且对应一个主机的请求数量小于每个主机的最大请求数量(maxRequestsPerHost),那么把AsyncCall请求放到runningAsyncCalls的双端队列中,然后开始执行

List<Protocol>

    协议列表,默认的协议列表有HTTP2、HTTP1.1

    HTTP2相比HTTP1有的新特性

新的二进制格式;原先都是基于文本多路复用;一个连接时共享的,可以有多个请求;原先是一个请求/响应,且按次序排队header压缩;服务器推送List<ConnectionSpec>

  HTTP套接字连接的指定配置

  默认的连接规范协议有ConnectionSpec.MODERN_TLS ---TLSv1.3、TLSv1.2  加密且经身份验证的连接

                                     ConnectionSpec.CLEARTEXT  未加密且未经身份验证的连接

  对应的就是HTTP连接或者是HTTPS连接;其中HTTP连接端口是80,HTTPS连接的端口是443

EventListener.Factory

   是为请求Call创建的EventListener实例,用来在请求的生命周期中使用;一个Call的生命周期常见的有:

callStart  -- 当客户端把请求开始排队或者立即执行时调用dnsStart  --DNS查找之前调用,DNS就是通过域名查找IP地址的dnsEnd   --DNS查找之后马上调用connectStart --在启用套接字连接之前调用secureConnectStart --在启动一个TLS连接之前调用connectionAcquired --在获得请求的连接后调用

列举这几个主要也是说明一个请求的连接过程

ProxySelector

默认代理选择器是一个DIRECT的直连;一个代理服务的描述类是java.net.Proxy,代理可以通过类型和InetSocketAddress即可描述代理的全部内容

CookieJar

为HTTP cookies提供策略和持久性,对于策略是选择接受哪些cookies,拒绝哪些cookies;合理的策略就是拒绝所有的cookies;持久性就是提供cookies的存储,例如:内存、文件

SocketFactory

套接字工厂,默认的套接字工厂是DefaultSocketFactory,创建的套接字都是通过java.net.Socket描述;它实现用户套接字;套接字是两个机器通信的端点;套接字的实际工作由java.net.SocketImpl实现

HostnameVerifier

主机名验证 --即握手过程中,URL的主机名跟服务器标识的主机名进行匹配,验证机制通过实现者来判断是否允许此连接;

CertificatePinner

⽤用于设置 HTTPS 握⼿手过程中针对某个Host 的 Certificate Public Key Pinner,即把⽹网站证书链中的每⼀一个证书公钥直接拿来提前配置进 OkHttpClient ⾥里里去,以跳过本地根证书,直接从代码⾥里里进⾏行行认证。这种⽤用法⽐比较少⻅见,一般⽤用于防⽌止⽹网站证书被⼈人仿制。

Authenticator

⽤用于⾃自动重新认证。配置之后,在请求收到 401 状态码的响应是,会直接调⽤用 authenticator ,⼿手动加⼊入 Authorization header 之后自动重新发起请求。

ConnectionPool

管理HTTP和HTTP2连接的重用,以减少网络延迟;目前连接池最多容纳5个空闲连接,这些连接在5分钟不活动后退出

Dns

把主机名解析成IP地址的域名服务

followSslRedirects

客户端配置为遵循从HTTPS到HTTP和从HTTP到HTTPS的重定向,默认是true

followRedirects

遇到重定向的要求是,是否自动 follow,默认是true

retryOnConnectionFailure

在请求失败的时候是否⾃自动重试。这种重试只适⽤用于「同⼀一个域名
的多个 IP 切换重试」「过时的Socket 」[无法访问的代理服务器]

callTimeout

设置完成请求的超时;调用超时跨越整个调用:解析DNS、连接、写入请求、正文、服务器处理和读取响应正文。如果呼叫需要重定向或

所有重试都必须在一个超时时间内完成;默认为0,则不设置超时

connectTimeout

建立连接(TCP 套接字)的超时时间;默认值是10S

readTimeout

发起请求到读到响应数据的超时时间,默认是10S

writeTimeout

发起请求并被⽬目标服务器器接受的超时时间,默认是10S

pingInterval

默认值是0,禁用客户端ping;

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。