浅析OkHttp,认识Retrofit的核心

探索网络请求核心代码一、OkHttp是什么二、Retrofit与OkHttp的关系三、OkHttp核心源码解析1、(Where)请求发送到哪里了2、(Who)请求被谁处理了2.读入数据总结一、OkHttp是什么OkHttp与Retrofit一样,同出一处,二者皆是极为优秀的开源框架,HTTP是现代应用程序网络的方式。这就是我们交换数据和媒体的方式。有效地执行HTTP可以使您的内容加载更快并节省带宽。OkHttp是默认情况下有效的HTTP客户端:HTTP / 2支持允许对同一主机的所有请求共享一
摘要由CSDN通过智能技术生成


图片源自网络,侵权删除

一、OkHttp是什么

OkHttpRetrofit一样,同出一处,二者皆是极为优秀的开源框架,HTTP是现代应用程序网络的方式。这就是我们交换数据和媒体的方式。有效地执行HTTP可以使您的内容加载更快并节省带宽。

OkHttp是默认情况下有效的HTTP客户端:

  • HTTP / 2支持允许对同一主机的所有请求共享一个套接字。
  • 连接池可减少请求延迟(如果HTTP / 2不可用)。
  • 透明的GZIP缩小了下载大小。
  • 响应缓存可以完全避免网络重复请求。

当网络出现问题时,OkHttp会坚持不懈:它将从常见的连接问题中静默恢复。如果您的服务具有多个IP地址,则在第一次连接失败时,OkHttp将尝试使用备用地址。这对于IPv4 + IPv6和冗余数据中心中托管的服务是必需的。OkHttp支持现代TLS功能(TLS 1.3,ALPN,证书固定)。可以将其配置为回退以获得广泛的连接性。

使用OkHttp上手容易简单。它的请求/响应API具有流畅的构建器和不变性。它支持同步阻塞调用和带有回调的异步调用。

二、Retrofit与OkHttp的关系

简单来说Retrofit是针对Java或Android基于OkHttp之上进一步的封装,Retrofit依赖于OkHttp,将网络请求的核心部分交给OkHttp执行,Retrofit使用注解方式,大大简化了我们的URL 拼写形式,而且注解含义一目了然,简单易懂; 支持多种文件格式解析(JSON,GSON,XML等); 实现强大的同步与异步执行,使得请求变得更易入手。

三、OkHttp核心源码解析

在学习这些核心代码过程中,完全是以个人的角度及结合了一些官方文档、网络资料进行的,所以,有哪些地方解析有误,也望大家在评论中指出一二。
言归正传,抛开OkHttp核心以外的方法,我们慢慢深入OkHttp网络请求核心的部分,其核心部分可以分三个点切入分析:

  1. (Where)请求发送到哪里了
  2. (Who)请求被谁处理了
  3. (How) 请求是怎么维护的

首先,来一个简单的网络请求的简单例子:

class MainActivity : AppCompatActivity() {
   

    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)

        //构建OkHttpClient
        val client = OkHttpClient.Builder().build()
        //构建Request
        val request = Request.Builder().url(Api.BASE_URL).build()
        //创建Call接口对象
        val call = client.newCall(request)
        //异步请求
        call.enqueue(object : Callback {
   
            //异步请求失败
            override fun onFailure(call: Call, e: IOException) {
   
                Log.e("FAIL", "请求失败---->${
     e.message}")
            }

            //异步请求成功
            override fun onResponse(call: Call, response: Response) {
   
                Log.e("Success", "请求数据---->${
     response.body}")
            }
        })
    }
}

根据代码发现,通过call接口对象调用enqueue()入队的回调Callback实现的两个方法(onFailure和onResponse)中获取响应数据结果,所以核心的切入点是从call.enqueue(Callback回调)开始的。

1、(Where)请求发送到哪里了

在上面的简单的例子中,我们发现请求是被送入队列中的,通过call.enqueue(Callback回调)入队,进入enqueue方法我们发现:

interface Call : Cloneable {
   
  ...
  fun enqueue(responseCallback: Callback)
  ...
}

enqueue其实是Call接口定义需要实现的入队方法,那Call接口会在那里被实现呢,进一步入代码中我们发现,这个接口在RealCall中被实现:

class RealCall(
  val client: OkHttpClient,
  /** The application's original request unadulterated by redirects or auth headers. */
  val originalRequest: Request,
  val forWebSocket: Boolean
) : Call {
   
  ...
  //请求进入队列
  override fun enqueue(responseCallback: Callback) {
   
    check(executed.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值