美文网首页
OkHttp逐步深入

OkHttp逐步深入

作者: YongtaoHuang | 来源:发表于2019-07-18 06:29 被阅读0次

本文主要分析OkHttp处理Http网络请求的整体流程。
下图是Http最简单最核心的示意图,HTTP就是从客户端发送Http Request(请求)给服务器,并接收从服务器返回的Http Response(响应)。


OkHttp.png

而OkHttp就是协助客户端(主要是安卓)执行Http协议,发Http请求,收Http响应。但是Http协议远比这要复杂得多。
每张图对比之前的图,增加的部分用\color{blue}{浅蓝}

从拦截器Interceptor开始。

拦截器定义:观察,修改以及可能短路的请求输出和响应请求的回来。通常情况下拦截器用来添加,移除或者转换请求或者回应的头部信息。

OkHttp3.png
整个拦截器链包括:应用拦截器,OkHttp核心,网络拦截器。其中OkHttp核心包括
1、RetryAndFollowUpInterceptor: 请求重试拦截器
2、BridgeInterceptor:桥接拦截器
3、CacheInterceptor:缓存拦截器
4、ConnectInterceptor:连接拦截器
这4个部分是不可修改的。而
1、ApplicationInterceptor: 应用拦截器
2、NetworkInterceptor:网络拦截器
可以配置的。
方向上:
Request是从应用拦截器走到网络拦截器。
Response是从网络拦截器走到应用拦截器。

谈谈调度器Dispatcher

调度器使Http的收发支持高并发。同步调度直接进入拦截器,异步调度则进入调度器,等待分配。调度器内含一个线程池

OkHttp4.png

考虑缓存服务器

移动端的应用,所有请求速度越快,用户体验越完美。所以缓存在移动端对于用户体验影响极大。拦截器将Request发出是先发送给本地缓存服务器,若本地缓存服务器拥有有效的缓存,则直接返回Reponse;若没有,才向服务器发Request。


OkHttp5.png

OkHttp框架常用套路

平时使用OkHttp框架都是用下面的套路:

// 同步请求
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
                    .url("***")
                    .build();
Response response = client.newCall(request).execute();
// ==========================================================
// 异步请求
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
                    .url("***")
                    .build();

Response response = client.newCall(request).enqueue(new Callback() {
  @Override public void onFailure(Request request, Throwable throwable) {
  }

  @Override public void onResponse(Response response) throws IOException {
  }
});

可以看出来涉及核心类明显的有:OkHttpClient、Request 、Response和Call,隐含在其中的有Dispatcher、Interceptor和Cache。当然,整体流程还得细节到HttpCodec、Stream、Router、Connection等。最后我们在之前得出流程图中补充Call类。

Call类

先谈谈Call类的作用。Call是已准备好要执行的请求的接口,RealCall和AsynCall是Call的具体实现。Call类让包装的的同/异步的get/post指令的Request,拥有了动作。Call和Request是同一件事物的内容与动作的分离。内容会变;动作就是同/异步和get/post指令的排列组合,不变;符合程序设计变与不变分离的原则。

OkHttp6.png

重要接口和实现类总结

BridgeInterceptor implements Interceptor
CacheInterceptor implements Interceptor
CallServerInterceptor implements Interceptor
ConnectInterceptor implements Interceptor
RetryAndFollowUpInterceptor implements Interceptor
RealInterceptorChain implements Interceptor.Chain
OkHttpClient implements Call.Factory, WebSocketCall.Factory
RealCall implements Call
RealConnection implements Connection
RealWebSocket implements WebSocket
RealWebSocketCall implements WebSocketCall

框架源码阅读经验之谈

第一步:从框架的使用入手,了解框架源码主干流程
第二步:将框架从接口和抽象类开始解剖,而后辅以类图加以组合
第三部:抠细节,主要关注功能和设计模式

相关文章

  • OkHttp逐步深入

    本文主要分析OkHttp处理Http网络请求的整体流程。下图是Http最简单最核心的示意图,HTTP就是从客户端发...

  • 逐步深入

    此后他不会再在我楼下等我了,直接来家等我,陪着我挑选每天要穿的衣服,看着我往脸上抹那些瓶瓶罐罐。还不断地问着,说他...

  • Android 开源库之网络请求

    Okhttp OkHttp: 是Square 开源的网络请求库 参考:深入理解OKHttp源码 Retrofit ...

  • 观察逐步深入

    昨天早起跑步10公里。终于得到新学期返校通知。新学期,在延迟15天之后,终于踏上了新的征程。各种忙碌,各种准备,感...

  • 字节面试官:Okhttp连接池是咋实现的?

    背景 最近把Okhttp的源码又整理了下,之前也写过Okhttp源码的文章,我觉得那会对Okhttp的认识不够深入...

  • 当面时问道"Okhttp连接池是咋实现"时,该咋回答呢?

    背景 最近把Okhttp的源码又整理了下,之前也写过Okhttp源码的文章,我觉得那会对Okhttp的认识不够深入...

  • okhttp深入解析

    一、okhttp简介 OkHttp是当下Android使用最频繁的网络请求框架,由Square公司开源。Googl...

  • OkHttp源码深入

    在OkHttp3中,其灵活性很大程度上体现在可以拦截 其任意一个环节,而这个优势便是okhttp3整个请求响应架构...

  • 重识OkHttp——探究源码设计

    本文是重试OkHttp系列的第2篇,依然是基于OkHttp3.4。上一篇重识OkHttp——更深入了解如何使用算是...

  • OkHttp总结一

    OkHttp的总结分为两个部分,一个是基本用法,带你认识OkHttp,第二部分是源码分析带你对OkHttp进行深入...

网友评论

      本文标题:OkHttp逐步深入

      本文链接:https://www.haomeiwen.com/subject/fbxflctx.html