Android_开源
Rxjava
Retrofit
Okhttp
-
连接池
-
OkHttpClient
-
建造者模式
-
初始化相关参数,例如:超时时间、重试机制、重定向、认证等等
-
分发器即执行器Dispatcher:其中包含最大请求书、线程池、等等
-
-
Request创建
-
通过Request.Builder创建
-
包含url、参数、请求方式、消息体等
-
通过okhttpclient.newCall(request)得到一个RealCall对象
-
-
Request执行
-
通过readCall.enqueue(new callbak)将请求加入到队列,并设置回调监听
-
实际上市由okhttpclient中的dispatcher执行enqueue(new AsynCall(callback))
-
检查当前队列执行状态,将新加入的任务放入执行队列或者缓存队列
-
通过getResponseWithInterceptorChain()拿到响应进行回调
-
清理缓存区finished
-
-
拦截器解析
-
责任链模式:为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦
-
拦截器 Interceptor
-
应用拦截器
-
主要用于查看请求信息及返回信息,如链接地址、头信息、参数信息等
-
不必担心响应和重定向之间的中间响应
-
通常只调用一次,即使HTTP响应是通过缓存提供的
-
遵从应用层的最初目的,与OkHttp的注入头部无关
-
允许短而且不调用Chain.proceed()
-
允许重试和多次调用Chain.proceed()
-
-
网络拦截器
-
可以添加、删除或替换请求头信息,还可以改变的请求携带的实体
-
允许像重定向和重试一样操作中间响应。
-
防落发生短路时不可调用缓存详情
-
在数据被传递到网络时观察数据
-
有权获得装在请求的链接
-
-
-
默认有5个拦截器,通过Interceptro.Chain的子类RealnterceptroChain管理,在RealCall中调用
-
RetryAndFollowUpInteceptor负责失败重连以及重定向的
-
根据client 、addres、request创建StreamAllocation,它主要用于管理客户端与服务器之间的连接,同时管理连接池,以及请求成功后的连接释放等操作,内部还有RouteSelector等,不同层次处理不同的信息
-
内部while(true)循环,处理其他后续拦截器的异常,并不是所有失败都重新连接
-
通过followUpRequest是否为重定向请求(包含很多响应码:4xx请求错误、3xx重定向错误等),不为null继续请求,为null结束请求
-
重定向次数限制为20、请求消息体验证(form、multipart、contentType(含json、text等))
-
其中还包含很多逻辑处理、异常处理
-
-
BridgeInterceptor 主要负责构造请求,如请求头,以及构造请求结果和处理如是否有gzip压缩等
-
将content-type、content-length、encoding等属性从body中取出,添加到requestheader中
-
默认添加gzip压缩、初期其他头信息
-
继续分发获取response
-
处理响应头,例如GZIP解压
-
-
CacheInterceptor 缓存处理,读取缓存,缓存更新等(POST/PATCH/PUT/DELETE/MOVE并不支持缓存)
-
通过client设置Cache对象,其中包括文件路径及文件大小
-
通过DiskLruCache获取缓存的响应
-
通过CacheStrategry处理是否需要重新请求
-
继续分发获取response
-
验证响应更新或者新增缓存
-
-
ConnectInterceptor 负责和服务器建立连接
-
通过StreamAllocation.newStream获取一条可用的连接
-
通过findHealthyConnection获取可用的连接,while(true)
-
还设计路由、代理、dns、ip、port等等
-
-
CallServerInterceptor 负责跟服务器交互,发送请求,获取响应
-
通过HttpCodec编码request和解码response
-
发送头信息
-
发送消息体
-
通过finishRequest将信息flush出去
-
读取响应信息
-
处理连接
-
返回信息
-
-
RealInterceptorChain:负责执行上面的这些拦截器
-
-
自定义拦截器。但是以一定要保证返回正确的Response
-
最先执行的拦截器,最后执行结束:拦截前->proceed->拦截后
-