OkHttp源码系列-“起步”

175 阅读2分钟

不知道在哪儿听到一句话:”最有效的学习,就是输出“。嗯,很有道理,这就实践起来。

OkHttp的源码我没有系统读过,但这个开源库对于Android开发尤为重要,这次必须把它拿下,希望感兴趣的朋友一起加入进来,共同成长进步。

起步

OkHttp项目的工程量不小,如果一上来就抱着啃,那可是相当难啃,就像读一本书一样,刚开始我会看一下前言,了解一下大致的背景,如法炮制,先看看OkHttp仓库的ReadMe,看看项目开发者们想对我们说些什么。该系列的版本为4.12.0。

ReadMe

1. 简介

OkHttp有一个专属网站,这里面有项目详细的文档和API介绍。
OKHttp是一个高效的Http客户端,主要具有以下特性:

  • 支持HTTP/2:同一主机的所有请求可以共享一个socket(套接字);
  • Connection pooling(连接池):在不支持HTTP/2的情况下,管理和复用连接;
  • Transparent GZIP:通过GZIP压缩从而减少网络数据量,提高性能和效率;
  • Response Caching:支持响应缓存。

2.简洁的API

使用OkHttp非常简单,请求和响应API采用了build模式和不可变设计,并且支持同步和异步调用。

流畅的build模式:OkHttp的请求/响应API使用了build模式,采用链式调用设置参数并创建请求,例如:

val request = Request.Builder()
  .url("https://publicobject.com/helloworld.txt")
  .addHeader("User-Agent", "OkHttp Example")
  .build()

不可变性:OkHttp的请求/响应对象都是不可变的,这意味着一旦创建就不能更改,这样可以确保请求和响应的一致性和安全性。

同步调用:可以使用OkHttp发送同步阻塞的网络请求,通过Call对象的execute()方法,发送请求并阻塞当前线程,直到收到响应或者发生异常。如下是发送一个同步请求的示例:

val client = OkHttpClient()
val request = Request.Builder()
  .url("https://publicobject.com/helloworld.txt")
  .addHeader("User-Agent", "OkHttp Example")
  .build()
val response = client.newCall(request).execute()
println("response: $response")
println("end network!")

// 输出
response: Response{protocol=http/1.1, code=200, message=OK, url=https://publicobject.com/helloworld.txt}
end network!

异步调用与回调:OkHttp还支持异步调用并使用回调来处理异步请求的响应,通过调用Call对象的enqueue()方法,并传入一个回调函数,请求将在后台发送,不会阻塞当前线程。如下是发送一个异步请求的示例:

val client = OkHttpClient()
val request = Request.Builder()
  .url("https://publicobject.com/helloworld.txt")
  .addHeader("User-Agent", "OkHttp Example")
  .build()
client.newCall(request).enqueue(object : Callback {
  override fun onFailure(call: Call, e: IOException) {
    println("onFailure: $e")
  }

  override fun onResponse(call: Call, response: Response) {
    println("onResponse: $response")
  }
})
println("end send network!")

//输出
end send network!
onResponse: Response{protocol=http/1.1, code=200, message=OK, url=https://publicobject.com/helloworld.txt}

3. 最后

  • Okhttp依赖于Android 5.0+和Java 8+(不过有个3.12.x分支支持更低版本的android和java),Oki和kotlin standard library。
  • 强烈建议及时更新Okhttp的版本,以提升安全性,并且团队及时跟踪TLS动态,并更新。
  • Okhttp还包含一个用于测试的库:com.squareup.okhttp3:mockwebserver