一、okhttp简介
OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)。现在在Android开发中最火的应用最多的联网框架毫无疑问是okhttp,目前已经大量替代了Volley、HttpUrlConnection。
二、okhttp用法
1)导包:
compile 'com.squareup.okhttp3:okhttp:3.9.1'
2)通过Builder类实例化客户端类OkhttpClient。
private val client: OkHttpClient by lazy {
OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(60, TimeUnit.SECONDS)
.writeTimeout(60, TimeUnit.SECONDS)
.build()
}
实例化OkhttpClient时可以通过Builder类添加一系列客户端参数。
3)通过Builder类实例化请求类Request,通过OkHttpClient的newCall方法执行请求。
fun get(url: String, callBack: ResponseCallBack) {
var request = Request.Builder()
.url(Api.baseUrl + url)
.build()
client.newCall(request).enqueue(
object : Callback {
override fun onFailure(call: Call, e: IOException) {
callBack?.onFail(e.toString())
}
override fun onResponse(call: Call, response: Response) {
callBack?.onSuccess(response.body()!!.string())
}
}
)
}
fun post(url: String, requestParams: RequestParams, callBack: ResponseCallBack) {
var requestBody = FormBody.Builder()
requestParams.forEach {
requestBody.add(it.key, it.value.toString())
}
var request = Request.Builder()
.url(Api.baseUrl + url)
.post(requestBody.build())
.build()
client.newCall(request).enqueue(
object : Callback {
override fun onFailure(call: Call, e: IOException) {
callBack?.onFail(e.toString())
}
override fun onResponse(call: Call, response: Response) {
callBack?.onSuccess(response.body()!!.string())
}
}
)
}
实例化Request时可以通过Builder类添加一系列请求参数(例如Header信息),这里也不进行详细描述,在分析源码时进行具体分析。
4)同步、异步请求。execute()执行同步请求,enqueue()执行异步请求,同步请求方法返回Response,异步请求通过CallBack返回Response。
三、源码分析
1)OkHttpClient客户端类,主要看一下各个成员变量。
final Dispatcher dispatcher;//请求分发器,分发执行Request
final @Nullable Proxy proxy;//代理
final List<Protocol> protocols;//协议,管理协议版本
final List<ConnectionSpec> connectionSpecs;//传输层版本和连接协议
final List<Interceptor> interceptors;//拦截器
final List<Interceptor> networkInterceptors;//网络拦截器
final EventListener.Factory eventListenerFactory;//请求监听器
final ProxySelector proxySelector;//代理选择
final CookieJar cookieJar;//cookie
final @Nullable Cache cache;//缓存
final @Nullable InternalCache internalCache;//内部缓存
final SocketFactory socketFactory;//socket工厂
final @Nullable SSLSocketFactory sslSocketFactory;//HTTPS ssl安全套接层工厂
final @Nullable CertificateChainCleaner certificateChai