美文网首页
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逐步深入

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