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