OKHttp常见概念总结

277 阅读3分钟

1、应用拦截器与网络拦截器的区别

image.png

  • 时机不一样,应用拦截器在重试重定向拦截器之前。网络拦截器在连接拦截器和请求拦截器之间
  • 短路应用拦截器先请求,请求可能会命中缓存然后不跑网络拦截器
  • 应用拦截器拦截一次,网络拦截器可能执行多次(错误重试或者网络重定向)
  • 应用拦截器调用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: 所有内容都不会缓存,强制缓存,对比缓存都不会触发。

image.png

3.2.2、 协商缓存 问服务器

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

image.png

image.png

4、Okhttp优点

  • 使用简单使用外光模式,就暴露出来个OKhttpclient
  • 扩展性强,可加应用拦截器和网络拦截器,自定义的
  • 支持多协议http1/2 Websocket SPDY
  • 通过连接池复用底层TCP(Socket),减少请求延时
  • 支持GZIP,节约流量
  • 支持数据缓存,减少重复网络请求
  • 支持请求失败自动重定向主机其它IP,自动重定向
  • 总结:简单、扩展拦截、多协议、复用连接、GZIP、缓存、自动重定向

5、Okhttp用了哪些设计模式

  • 构建者模式:看builder
  • 外观模式:也就是门面设计模式,,将整个系统的复杂性给隐藏起来,将子系统接口通过一个客户端OkHttpClient统一暴露出来。
  • 责任链模式:拦截器就是用的责任链
  • 享元设计模式:连接池复用