OkHttp源码彻底解析(一)OkHttp请求流程

前言

OkHttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso)

用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,现在已经打不出来),这是现在非常主流的一个网络请求框架了。

可能有人会说Retrofit+RxJava才是最主流的,好吧,其实Retrofit的强大也是基于OkHttp,其是在OkHttp的基础上进一步封装,所以OkHttp也是切入Retrofit源码学习的入口。

博主对Retrofit2.x和OkHttp3.0也是比较熟悉的,刚好最近比较有空,接着周末时间总结了OkHttp。

本系列将带领大家从源码的出发,做到尽可能详细地剖析OkHttp的每一个知识点。

作为本系列的第一篇,也算是个序篇,不打算过多深入,仅仅带过一下网络请求的整个流程。

 

本系列文章:

OkHttp源码彻底解析(一)OkHttp请求流程

OkHttp源码彻底解析(二)OkHttp架构及API源码

OkHttp源码彻底解析(三)OkHttp3.0拦截器原理——责任链模式

OkHttp源码彻底解析(四)OkHttp拦截器的作用

OkHttp源码彻底解析(五)OkHttp连接池

 

正文

 

OkHttp整体流程图

OkHttp请求的大致流程图如下

 

 

其中,图中省略号部分是OkHttp的拦截器

 

 

最后一个拦截器CallServerInterceptor实现了网络请求,,将HTTP请求写入网络IO流,从IO流读取网络数据,并获取返回的数据

 

 

OkHttp文字流程

整个OkHttp的使用流程,就是从客户端往指定服务器发送一个Request到服务器返回一个Response

可以粗略地将这个流程分为四部分


1.生成请求(封装生成Call):将外观类(OkHttpClient)和数据请求类(Request)封装生成同步请求类(RealCall):
若是同步请求,则直接调用的同步请求类(RealCall)同步(execute)方法;
若是异步请求,则封装成异步请求类(RealCall的内部类AsyncCall),再调用它的异步(enqueue)方法。


2.管理请求(Dispatcher调度请求):把生成的请求扔给调度器(Dispatcher)进行管理


3.执行请求(拦截器):也就是图中Dispatcher往下的部分:
这个部分是 OkHttp 的核心,使用了 分层设计 + 链式调用 思想,使用了责任链模式。
这里使用责任链设计模式是考虑到网络请求操作是一个很复杂的操作(我们必须考虑多种情况,如重定向、Socket连接、TLS安全、Cache复用、连接池复用等等)
为了使复杂操作的逻辑相对清晰,OkHttp采用了分层设计的思想,使用多层拦截器,每个拦截器解决一个问题。

4.真正实现网络通讯 :最后的拦截器(CallServerInterceptors)才 真正的进行了网络请求,将HTTP请求写入网络IO流,从IO流读取网络数据(OKIO)          OKHttp的网络请求的实现是socket(应用程序与网络层进行交互的API)。socket发起网络请求的流程一般是:
(1). 创建socket对象;
(2). 连接到目标网络;
(3). 进行输入输出流操作。 (okio)

其中,前两步由拦截器中创建的RealConnection来实现,第三步是通过stream接口来实现(IO操作底层由okio实现),根据不同的网络协议,有Http1xStream和Http2xStream两个实现类。

 

 

看完了本篇博客,相信你对OkHttp的整个流程已经有了一个大致的了解。

最后说一下,如果想真正掌握网络请求的具体流程,单单本文是远不够的,所以我会写一个系列,

涉及了OkHttp3.0工具类源码及一些逻辑流程,拦截器,连接池,Socket与okio。

旨在了解OkHttp的实现流程,学习其内部的一些执行机制,学习OkHttp中的一些设计模式的用法并举一反三运用到自身项目当中。

你可能感兴趣的:(OkHttp源码彻底解析系列)