• Retrofit 帮助 OKHttp 解决了多少问题?


    前言

    相信大家在学习 Retrofit 后,都会思考到一个问题, OKHttp 作为网路请求第三方库,Retrofit 的出现帮助 OKHttp 解决了多上问题?由于他的本质网络请求一直都是依靠 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())
                }
    ​
            })
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    具体的结果 response 需要自己去解析,都是由用户自己去实现的,而 OKHttp 主要工作就是用来网络请求,也就是一种高内聚的,非常棒的关于网络请求方案具体的实现

    Retrofit 对于 OKHttp 重要性

    可以说 Retrofit 的出现帮助 OKHttp解决了一些存在的问题,使我们能更方便的在 APP 应用层上使用网络请求。

    OKhttp 存在的问题

    使用过 OKHttp 做网路请求的人都知道,在使用过程中会出现以下问题:

    1. 客户端网络请求的接口配置比较繁琐,尤其是在需要配置复杂请求body,请求头,参数的时候
    2. 数据解析过程中需要客户端手动拿到responseBody进行解析,而且还不能复用
    3. 无法适配自动进行线程的切换
    4. 万一我们存在嵌套网络请求就会陷入"回调陷阱"

    为了更好的完善解决这些问题,就有了 Retrofit,而它不是一个网路请求框架,它只是一个 RESTful 风格的 Http 网络请求框架的封装,而它仅仅负责网络请求接口的封装,最终完成任务的还是 OKHttp;

    从Retrofit出生开始就已经决定了它只是为了方便应用层来使用网络请求

    1. App应用层通过Retrofit去请求网络,实际上是使用Retrofit接口层封装请求参数,Header,Url等信息,这些不再需要我们手动去配置了,之后就是OKHttp来完成后续的操作
    2. 等到服务器返回数据之后,OKHttp将原始的数据结果交给Retrofit,然后它更具用户的需求对结果进行解析,这样基本解决了OKHttp中的无法自动进行数据解析和复用的问题了
    3. 总的来说,Retrofit优化了网络请求的使用,分别在创建网络请求的时候以及网络请求数据返回解析的时候,这样一来,图示就很明显了,如何去更好的创建Okhttp的网络请求,Okhttp返回数据之后如何更好的去解析,Retrofit基本上就解决了这两个问题

    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做了什么工作,如图所示

    1. 请求前主要做了两件事情: 统一配置网络请求头和一致适配请求Request,我们知道OKHttp实现的是Http协议,那么就有一定的规则,请求方法就只有八种(GET,POST,PUT,DELETE,PATCH,HEAD,OPTIONS,HTTP),既然都是符合Http协议的规则,那么就可以使用统一的规则来适配网络请求,这些在Retrofit里就是通过注解的形式,按照一定的策略来调配, 所以我们就把注解的解析过程看成一致适配请求Request
    2. 请求后也做了两件事情,就是将线程自动切换,数据自动适配成我们需要的java对象并且展示在UI线程

    总体来说,我们知道了Retrofit在逐力解决上述这些问题,这也就是Retrofit的核心是用动态代理的原因了,因为请求前需要适配Request进行网络请求,而这个网络请求是由OKHttp这个委托者代理完成的,换句话说,Retrofit其实本身并不具备网络请求功能,它只是被OKHttp委托Retrofit对外进行网络请求,而Retrofit只是个代理,只是在网络请求前进行请求统一配置,请求之后进行数据处理,真正的网络请求依旧是OKHttp进行的;所以当问到Retrofit是如何进行网络请求的?回答只需要和OKHttp的一样就可以了

    针对上面所提到的 OKHttp 相关问题,特此整理了一套 OKHttp 源码解析的学习手册,希望能更好的学习,有需要参考学习的直接 点击这里查看获取方式传送门直达!

  • 相关阅读:
    城市三维地理信息可视化 技术解析
    Net相关的各类开源项目
    Chronos——中
    pg14-sql基础(二)-排序与统计
    偶数科技发布实时湖仓数据平台Skylab 5.3版本
    Vue-点击 li 动态添加class -->[练]
    注册商标好处,商标注册流程
    【学习笔记】字符串
    一篇文章让你掌握java的多态
    何为vue脚手架?
  • 原文地址:https://blog.csdn.net/m0_71263309/article/details/126250902