相信大家在学习 Retrofit 后,都会思考到一个问题, OKHttp 作为网路请求第三方库,Retrofit 的出现帮助 OKHttp 解决了多上问题?由于他的本质网络请求一直都是依靠 OKHttp 来进行封装的。至于它封装的点是怎么解决 OKHttp 不友好的地方,这是下面我们探讨的问题。
OKHttp 构建流程大概有以下四个步骤:
1.构建 okhttpClient 实例
2.构建 Request,网络请求参数
3.构建请求 call
4.服务器返回数据 response
以 OKHttp 异步请求为例子:
private fun asyRequest() {
//1.构建okhttpClient实例
val client = OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build()
//2.构建Request,网络请求参数
val request = Request.Builder().url("https://www.baidu.com")
.get().build()
//3.构建请求call
val call = client.newCall(request)
//请求数据返回,手动切换请求适配器,手动切换线程
call.enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
println(e.message)
}
override fun onResponse(call: Call, response: Response) {
println(response.body().toString())
}
})
}
具体的结果 response 需要自己去解析,都是由用户自己去实现的,而 OKHttp 主要工作就是用来网络请求,也就是一种高内聚的,非常棒的关于网络请求方案具体的实现

Retrofit 对于 OKHttp 重要性可以说 Retrofit 的出现帮助 OKHttp解决了一些存在的问题,使我们能更方便的在 APP 应用层上使用网络请求。
使用过 OKHttp 做网路请求的人都知道,在使用过程中会出现以下问题:
为了更好的完善解决这些问题,就有了 Retrofit,而它不是一个网路请求框架,它只是一个 RESTful 风格的 Http 网络请求框架的封装,而它仅仅负责网络请求接口的封装,最终完成任务的还是 OKHttp;
从Retrofit出生开始就已经决定了它只是为了方便应用层来使用网络请求

App应用层通过Retrofit去请求网络,实际上是使用Retrofit接口层封装请求参数,Header,Url等信息,这些不再需要我们手动去配置了,之后就是OKHttp来完成后续的操作OKHttp将原始的数据结果交给Retrofit,然后它更具用户的需求对结果进行解析,这样基本解决了OKHttp中的无法自动进行数据解析和复用的问题了Retrofit优化了网络请求的使用,分别在创建网络请求的时候以及网络请求数据返回解析的时候,这样一来,图示就很明显了,如何去更好的创建Okhttp的网络请求,Okhttp返回数据之后如何更好的去解析,Retrofit基本上就解决了这两个问题我们已经知道Retrofit是为了解决OKHttp存在的问题而引申出来的,那么Retrofit针对这些问题时如何进行封装的呢?它封装的点是怎么样的,可以通过下面这张图直观感受到

Okhttp创建的是OKHttpClient,然而retrofit创建的是Retrofit实例Request的方案,Retrofit是通过注解来进行适配Call的过程中,Retrofit是利用Adapter适配的OKHttp的Call,为Call的适配提供了多样性,那么Retrofit可以支持Rxjava,这样一来就可以解决上面所提到的网络请求嵌套问题OKHttp,Retrofit会对responseBody进行自动的GSON解析,提供了可复用,易拓展的数据解析方案OKHttp,Retrofit会自动的完成线程的切换Retrofit和OKHttp的关系阐述通过上面我们已经知道,Retrofit设计的任务主要就发生在OKHttp网络的请求前和请求后,下面我们就来看下请求前后Retrofit做了什么工作,如图所示

Request,我们知道OKHttp实现的是Http协议,那么就有一定的规则,请求方法就只有八种(GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS,HTTP),既然都是符合Http协议的规则,那么就可以使用统一的规则来适配网络请求,这些在Retrofit里就是通过注解的形式,按照一定的策略来调配, 所以我们就把注解的解析过程看成一致适配请求Requestjava对象并且展示在UI线程总体来说,我们知道了Retrofit在逐力解决上述这些问题,这也就是Retrofit的核心是用动态代理的原因了,因为请求前需要适配Request进行网络请求,而这个网络请求是由OKHttp这个委托者代理完成的,换句话说,Retrofit其实本身并不具备网络请求功能,它只是被OKHttp委托Retrofit对外进行网络请求,而Retrofit只是个代理,只是在网络请求前进行请求统一配置,请求之后进行数据处理,真正的网络请求依旧是OKHttp进行的;所以当问到Retrofit是如何进行网络请求的?回答只需要和OKHttp的一样就可以了
针对上面所提到的 OKHttp 相关问题,特此整理了一套 OKHttp 源码解析的学习手册,希望能更好的学习,有需要参考学习的直接 点击这里查看获取方式传送门直达!
