02.Okhttp
2021-12-13 17:22:36 0 举报
Okhttp
作者其他创作
大纲/内容
BridgeInterceptor.intercept()桥接拦截器
getResponseWithInterceptorChain()
执行 chain.proceed(),返回 Response 对象
RealCall.execute()
runningSyncCalls放到队列中
RetryAndFollowUpInterceptor.intercept()重定向拦截器
1. 设置请求头,如 Connection:Keep-Alive2. 执行下一个拦截器3. 设置响应头,如 cookie
构造拦截器链 interceptors先添加用户自定义的,再添加内置的
Deque<RealCall> runningSyncCalls = new ArrayDeque<>()它是一个双端队列(同步下没有实际作用)
关于超时的配置1. connectTimeout 最终设置给了 rawSocket2. readTimeout 最终设置给了rawSocket 以及在 socket 基础上创建的 BufferedSource3. writeTimeout 最终设置给了在socket基础上创建的BufferedSink4. rawSocket 的超时就是 socket 的超时,BufferedSource 和 BufferedSink 的超时是通过 AsyncTimeout 实现,即 watchDog 监控线程实现关于超时异常(OkHttp 抛出的异常是 watchDog 监控的超时,非 socket 超时异常)1. Socket 超时异常后会抛出 java.net.SocketTimeoutException: timeoutat okio.Okio$4.newTimeoutException(Okio.java:232) 但实质是 Caused by: java.net.SocketTimeoutException: Read timed out2. OkHttp 异常后会抛出 java.net.SocketTimeoutException: timeout3. 即无论如何都会被 OkHttp 包装一层
RealInterceptorChain.proceed()执行真正的调用方法
ConnectInterceptor.intercept()连接拦截器
CallServerInterceptor.intercept()读写拦截器
CacheInterceptor .intercept()缓存拦截器
1. 创建一个 ExchangeFinder2. 执行下一个拦截器3. 判断 followUp 是否为 null,不为 null 则跳转重定向
client.dispatcher().finished(this)
runningSyncCalls从队列中取出
ExchangeFinder.findConnection()1. 先尝试从连接池中获取连接,获取到直接 return2. 构造一个 RealConnection,并进行 connect() 三次握手连接,并基于连接后的 socket 构造 source、sink 对象3. 把创建好的连接放入到连接池中
client.dispatcher().executed(this)
转换成 RealInterceptorChainchain 可以动态设置连接、写、读超时
1. 先将请求中的 header 写给服务器2. 如果有请求体的话,会再将 body 发送给服务器3. 最后通过 exchange.finishRequest() 结束 http 请求的发送,这里会用到 writeTimeout 4. 然后通过 exchange.readResponseHeaders() 读取服务器的响应头,并构造 Response,这里会用到 readTimeout 5. 通过 exchange.openResponseBody() 读取响应 body6. 如果请求头或响应头重的 Connection 值为 close,就关闭连接
ExchangeFinder.find()1. 获取到可用的连接后,设置超时时间2. 根据 http 协议判断返回 Http1ExchangeCodec 还是 Http2ExchangeCodec
0 条评论
下一页