码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • OkHttp原理 一篇文章就够了


    早年写过一篇关于OkHttp的文章,只是不太深入,有兴趣的可以看看,也讲到一些OkHttp的基础使用:

    OkHttp核心源码分析_AD钙奶-lalala的博客-CSDN博客我们学习技术的时候,一开始是会用,进阶就是深入理解其原理,然而各路框架源码,系统源码又极为庞大,我们就必须知道如何去领会其中的核心思想。今天我们就一起来理一理OkHttp的核心源码,做到知其然知其所以然!OKHttp的使用:OkHttpClient okHttpClient = new OkHttpClient();一开始我们需要初始化OkHttpClient,这里使用的是一个无参构...https://blog.csdn.net/qq_36428821/article/details/104353749这篇两年前的文章我仔细看了一下,基本上调度器这一块已经讲的很透彻了,今天就不再浪费时间去讲调度器相关知识了。那么今天接着重点讲一下拦截器,我看以前的文章里面一笔带过了,估计当时我也不太理解。

    我们知道OkHttp执行异步任务底层其实是使用了线程池,执行的任务会走到AsyncCall的下面的方法:

    1. protected void execute() {
    2. boolean signalledCallback = false;
    3. transmitter.timeoutEnter();
    4. try {
    5. Response response = getResponseWithInterceptorChain();//1
    6. signalledCallback = true;
    7. responseCallback.onResponse(RealCall.this, response);
    8. } catch (IOException e) {
    9. if (signalledCallback) {
    10. // Do not signal the callback twice!
    11. Platform.get().log(INFO, "Callback failure for " + toLoggableString(), e);
    12. } else {
    13. responseCallback.onFailure(RealCall.this, e);
    14. }
    15. } catch (Throwable t) {
    16. cancel();
    17. if (!signalledCallback) {
    18. IOException canceledException = new IOException("canceled due to " + t);
    19. canceledException.addSuppressed(t);
    20. responseCallback.onFailure(RealCall.this, canceledException);
    21. }
    22. throw t;
    23. } finally {
    24. client.dispatcher().finished(this);
    25. }
    26. }

    我们要讲拦截器,首先就要讲一个设计模式:责任链模式。那么有同学可能会问什么是责任链模式呢?我就举个订外卖的例子:我们通过美团发起请求,然后美团将订购信息发给饭店,饭店再将信息传给厨师,厨师做好饭后将结果返回给饭店,饭店在将结果返回给美团。这样的过程差不多就是责任链模式。责任链模式可以理解为一个U型的结构。

    我们进到注释1看看:

    1. Response getResponseWithInterceptorChain() throws IOException {
    2. // Build a full stack of interceptors.
    3. List interceptors = new ArrayList<>();
    4. interceptors.addAll(client.interceptors());//1
    5. interceptors.add(new RetryAndFollowUpInterceptor(client));
    6. interceptors.add(new BridgeInterceptor(client.cookieJar()));
    7. interceptors.add(new CacheInterceptor(client.internalCache()));
    8. interceptors.add(new ConnectInterceptor(client));
    9. if (!forWebSocket) {
    10. interceptors.addAll(client.networkInterceptors());
    11. }
    12. interceptors.add(new CallServerInterceptor(forWebSocket));
    13. Interceptor.Chain chain = new RealInterceptorChain(interceptors, transmitter, null, 0,
    14. originalRequest, this, client.connectTimeoutMillis(),
    15. client.readTimeoutMillis(), client.writeTimeoutMillis());
    16. boolean calledNoMoreExchanges = false;
    17. try {
    18. Response response = chain.proceed(originalRequest);//2
    19. if (transmitter.isCanceled()) {
    20. closeQuietly(response);
    21. throw new IOException("Canceled");
    22. }
    23. return response;
    24. } catch (IOException e) {
    25. calledNoMoreExchanges = true;
    26. throw transmitter.noMoreExchanges(e);
    27. } finally {
    28. if (!calledNoMoreExchanges) {
    29. transmitter.noMoreExchanges(null);
    30. }
    31. }
    32. }

    OkHttp五大拦截器:

    RetryAndFollowUpInterceptor(重试和重定向拦截器)
    第一个接触到请求,最后接触到响应;负责判断是否需要重新发起整个请求
    BridgeInterceptor(桥接拦截器)
    补全请求,并对响应进行额外处理
    CacheInterceptor(缓存拦截器)
    请求前查询缓存,获得响应并判断是否需要缓存
    ConnectInterceptor(链接拦截器)
    与服务器完成TCP连接 (Socket)
    CallServerInterceptor(请求服务拦截器)
    与服务器通信;封装请求数据与解析响应数据(如:HTTP报文)

    我们注意注释1处,这个是我们自己定义的拦截器,比如常用的日志拦截器。注释2处调用以后,最开始执行自定义的拦截器,然后调用重试和重定向拦截器->桥接拦截器->缓存拦截器->链接拦截器->请求服务拦截器,数据返回经过请求服务拦截器->链接拦截器->缓存拦截器->桥接拦截器->重试和重定向拦截器->自定义拦截器。

    拦截器执行流程图如下:

    在这里插入图片描述

     

    拦截器的设计也很好的凸现了设计模式中的单一职责原则。

  • 相关阅读:
    【机器学习】聚类【Ⅰ】基础知识与距离度量
    【2022 谷歌开发者大会】名额有限,快来,带你体验谷歌的工程师文化
    python 中导出requirements.txt 的几种方法
    国内代码托管中心-码云(九)——Git
    汽车电子行业知识:UWB技术及应用
    【分享】小红书采集图片下载到本地
    [EFI]ThinkPad-X13-Gen1-20T3电脑 Hackintosh 黑苹果efi引导文件
    机器学习入门(五)回归问题中的曲线过拟合问题及解决
    OpenHarmony环境搭建报错: ImportError: cannot import name ‘VERSION‘ from ‘hb.__main__‘
    智能家居系统 QT
  • 原文地址:https://blog.csdn.net/qq_36428821/article/details/126753934
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号