ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

okhttp执行流程

2021-11-13 21:30:53  阅读:187  来源: 互联网

标签:调用 请求 流程 响应 开发者 okhttp Interceptor 执行 RealCall


    1. newCall(Request)方法会返回一个RealCall对象,它是Call接口的实现。当调用 RealCall.execute() 的时候,RealCall.getResponseWithInterceptorChain()会被调用,它会发起网络请求并拿到返回的响应,装进一个Response对象并作为返回值返回;RealCall.enqueue()被调用的时候大同小异,区别在于enaueue()会使用Dispatcher的线程池来把请求放在后台线程进行,但实质上使用的同样也是 getResponseWithInterceptorChain()方法。 
    2. getResponseWithInterceptorChain()方法做的事:把所有配置好的 Interceptor放在一个List里,然后作为参数,创建一个RealInterceptorChain对象,并调用chain.proceed(request)来发起请求和获取响应。
    3. 在RealInterceptorChain中,多个 Interceptor会依次调用自己的intercept()方法。这个方法会做三件事:
    当然了,最后一个Interceptor的任务只有一个:做真正的网络请求并拿到响应
        a. 1.对请求进行预处理
        b. 2、预处理之后,重新调用RealIntercepterChain.proceed()把请求交给下一个Interceptor
        c. 3、在下一个Interceptor处理完成并返回之后,拿到Response进行后续处理
    4. 从上到下,每级Interceptor 做的事:
        a. o首先是开发者使用 addInterceptor(Interceptor) 所设置的,它们会按照开发者的要求,在所有其他Interceptor处理之前,进行最早的预处理工作,以及在收到Response之后,做最后的善后工作。如果你有统一的header要添加,可以在这里设置;
        b. o然后是RetryAndFollowUpInterceptor:它会对连接做一些初始化工作,并且负责在请求失败时的重试,以及重定向的自动后续请求。它的存在,可以让重试和重定向对于开发者是无感知的;
        c. BridgeInterceptor:它负责一些不影响开发者开发,但影响HTTP交互的一些额外预处理。例如,Content-Length的计算和添加、gzip的支持 (Accept-Encoding: gzip)、gzip压缩数据的解包,都是发生在这里;
        d. o CacheInterceptor:它负责Cache的处理。把它放在后面的网络交互相关Interceptor的前面的好处是,如果本地有了可用的Cache,一个请求可以在没有发生实质网络交互的情况下就返回缓存结果,而完全不需要开发者做出任何的额外工作,让Cache更加无感知;
        e. oConnectInterceptor:它负责建立连接。在这里,OkHttp会创建出网络请求所需要的TCP连接(如果是HTTP),或者是建立在TCP连接之上的TLS连接(如果是HTTPS),并且会创建出对应的HttpCodec对象(用于编码解码HTTP请求);
        f. 然后是开发者使用addNetworkInterceptor(Interceptor)所设置的,它们的行为逻辑和使用addInterceptor(Interceptor)创建的一样,但由于位置不同,所以这里创建的Interceptor会看到每个请求和响应的数据(包括重定向以及重试的一些中间请求和响应),并且看到的是完整原始数据,而不是没有加Content-Length的请求数据,或者Body还没有被gzip解压的响应数据。多数情况,这个方法不需要被使用,不过如果你要做网络调试,可以用它;
        g. o CallServerInterceptor:它负责实质的请求与响应的I/0操作,即往Socket里写入请求数据,和从Socket里读取响应数据。


 

标签:调用,请求,流程,响应,开发者,okhttp,Interceptor,执行,RealCall
来源: https://blog.csdn.net/AndroidTalk/article/details/121310508

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有