OKHttp常见概念总结
1、应用拦截器与网络拦截器的区别

- 时机不一样,应用拦截器在重试重定向拦截器之前。网络拦截器在连接拦截器和请求拦截器之间
- 短路应用拦截器先请求,请求可能会命中缓存然后不跑网络拦截器
- 应用拦截器拦截一次,网络拦截器可能执行多次(错误重试或者网络重定向)
- 应用拦截器调用1次表示请求发情情况,用于统计客户端请求发起情况,网络拦截器一次表示发起一次通信,用于统计网络链路传输情况。
- 总结就是,
时机,短路,次数,场景。
2、Okhttp如何复用tcp连接
- 连接池 容器缓存所有的有效 连接对象
- 怎么清理垃圾连接?
- 超过5分钟没用的来链接,移除
- 超过5个闲置连接,用LRU算法清理。直到闲置链接少于5个。
3、OkHttp缓存机制
3.1、简介
- Okhttp内置缓存策略再缓存拦截器中默认不启动。如果启动可以设置全局缓存和单个请求缓存。OkHttp的缓存机制遵循Http的缓存协议
- OkHttpClient.Builder().cache(Cache(文件,大小)) .build() 开启。
- OkHttp只会缓存GET请求的响应,在RFC7231中GET,HEAD和某些情况下的POST都是可缓存的,但是绝大多数的实现里只支持GET和HEAD的缓存
3.2、缓存分类
3.2.1、强缓存 不问服务器
- expires 绝对时间,在这之前有效
- cache-control
- private: 客户端可以缓存
- public: 客户端和代理服务器都可缓存(前端的同学,可以认为public和private是一样的)
- max-age=xxx: 缓存的内容将在 xxx 秒后失效
- no-cache: 需要使用对比缓存来验证缓存数据(后面介绍)
- no-store: 所有内容都不会缓存,强制缓存,对比缓存都不会触发。

3.2.2、 协商缓存 问服务器
- 对比缓存表示需要与服务器对比决定缓存是否有效
- 第一次请求返回缓存标识(header中的last-modified/etag)
- 第二次请求带上上次请求的缓存标识
- 服务器如果判断缓存 有效则返回304,否则返回200并返回新的数据内容


4、Okhttp优点
- 使用简单使用外光模式,就暴露出来个OKhttpclient
- 扩展性强,可加应用拦截器和网络拦截器,自定义的
- 支持多协议http1/2 Websocket SPDY
- 通过连接池复用底层TCP(Socket),减少请求延时
- 支持GZIP,节约流量
- 支持数据缓存,减少重复网络请求
- 支持请求失败自动重定向主机其它IP,自动重定向
- 总结:
简单、扩展拦截、多协议、复用连接、GZIP、缓存、自动重定向
5、Okhttp用了哪些设计模式
- 构建者模式:看builder
- 外观模式:也就是门面设计模式,,将整个系统的复杂性给隐藏起来,将子系统接口通过一个客户端
OkHttpClient统一暴露出来。
- 责任链模式:拦截器就是用的责任链
- 享元设计模式:连接池复用