Okhttp学习总结

okhttp源码
如何下载查看源码
OkHttp使用完全教程
okhttp 源码浅析
OKHttp源码解析(九):OKHTTP连接中三个"核心"RealConnection、ConnectionPool、StreamAllocation
okhttp连接池复用机制
关于OkHttp3中publicsuffixes.gz的使用
根据Interceptor 分析 OkHttp
OkHttp 之 网络请求耗时统计
Kalle是一个Android平台的HttpClient
分块编码(Transfer-Encoding: chunked)
Android Https相关完全解析 当OkHttp遇到Https
Okhttp之RealConnection建立链接简单分析
OKHttp源码解析(三)——分发器Dispatcher
OkHttp3.0解析(三)——谈谈内部任务分发器dispatcher

一、拦截器
Interceptor可以说是OkHttp的核心功能,它就是通过Interceptor来完成监控管理、重写和重试请求的。OkHttp使用lists来管理Interceptors,让这些Interceptors按顺序被调用。

Application Interceptors和Network Interceptors分别位于七层模型的第一层和第六层。这个从RealCall里的getResponseWithInterceptorChain方法中就可以看出来:

//RealCall.java
Response getResponseWithInterceptorChain() throws IOException {
    //新建一个List用来保存拦截器
    List<Interceptor> interceptors = new ArrayList<>();
    //添加我们自定义的应用拦截器
    interceptors.addAll(client.interceptors());
    //添加负责重试重定向的拦截器
    interceptors.add(new RetryAndFollowUpInterceptor(client));
    //添加负责转换请求响应的拦截器
    interceptors.add(new BridgeInterceptor(client.cookieJar()));
    //添加负责缓存的拦截器
    interceptors.add(new CacheInterceptor(client.internalCache()));
    //添加负责管理连接的拦截器
    interceptors.add(new ConnectInterceptor(client));
    if (!forWebSocket) {//没有特殊要求,不使用WebSocket协议,WebSocket是什么?自行百度
      //添加我们自定义的网络拦截器
      interceptors.addAll(client.networkInterceptors());
    }
    //添加负责发起请求获取响应的拦截器
    interceptors.add(new CallServerInterceptor(forWebSocket));

    //构造第一个Chain
    Interceptor.Chain chain = new RealInterceptorChain(interceptors, transmitter, null, 0,
        originalRequest, this, client.connectTimeoutMillis(),
        client.readTimeoutMillis(), client.writeTimeoutMillis());

    boolean calledNoMoreExchanges = false;
    try {
       //调用Chain的proceed(Request)方法处理请求
      Response response = chain.proceed(originalRequest);
      //...
      //返回响应
      return response;
    }
    //...省略异常处理
  }

getResponseWithInterceptorChain()干了三件事:1、添加拦截器到interceptors列表中;2、构造第一个Chain(Chain是Interceptor的一个内部接口,它的实现类是RealInterceptorChain);3、调用Chain的proceed(Request)方法处理请求。
在这里插入图片描述

二、各拦截器详解:okhttp3源码分析之拦截器
1、添加拦截器到interceptors列表中
除了添加我们自定义的拦截器外,还添加了默认的拦截器,如下:

(1)RetryAndFollowUpInterceptor:
负责失败重试和重定向。
(2)BridgeInterceptor:
负责把用户构造的Request转换为发送给服务器的Request和把服务器返回的Response转换为对用户友好的Response。(例如,对于Request,当开发者没有添加Accept-Encoding时,它会自动添加Accept-Encoding : gzip,表示客户端支持使用gzip;对于Response,当Content-Encoding是gzip方式并且客户端是自动添加gzip支持时,它会移除Content-Encoding、Content-Length,然后重新解压缩响应的内容。)
(3)CacheInterceptor:
负责读取缓存以及更新缓存。(okhttp的缓存机制 = Cache缓存实现(DiskLruCache) + 基于HTTP的缓存策略)
浏览器 HTTP 协议缓存机制详解
Android DiskLruCache完全解析,硬盘缓存的最佳方案

在这里插入图片描述
(4)ConnectInterceptor:
负责与服务器建立连接并管理连接。
(5)CallServerInterceptor:
负责向服务器发送请求和从服务器读取响应。

发布了18 篇原创文章 · 获赞 2 · 访问量 3138

猜你喜欢

转载自blog.csdn.net/shiningdreamercaihua/article/details/104887891