因为这个系列是属于Android的基础系列,所以并不会涉及到很深的内容层次。作为网络这一个模块而言,我们经历了几个阶段。从最初的HttpClicent(已被废弃)到后面的HttpUrlConnection,当然在HttpUrlConnection的基础上出现了很多的网络框架,诸如:Volley,XUtils等等。但是随着OkHttp的推出,原来的这些网络框架都失去了色彩,OkHttp以其独特的魅力迅速获得了广大开发者的喜爱,今天我们就来看看关于OkHttp的那些事。
OkHttp的基本特性
(1)支持HTTP 2.0,允许所有同一个主机地址的请求共享一个socket链接。
(2)连接池复用减少请求延时,同步避免了资源浪费。
(3)透明的GZIP压缩减少响应数据的大小。
(4)自带缓存机制,可以避免一些重复请求。
(5)多IP使用,当服务断开后,自动切换备用IP地址,重新发起连接。
OkHttp的基本使用
添加依赖
// 网络请求框架
// define a BOM and its version
api(platform("com.squareup.okhttp3:okhttp-bom:4.9.1"))
// define any required OkHttp artifacts without version
api("com.squareup.okhttp3:okhttp")
api("com.squareup.okhttp3:logging-interceptor")
异步get请求
主要的步骤为:
(1)创建OkHttp实例。
(2)构建请求参数 默认为get()请求,可以不写。
(3)构建请求。
(4)发送请求并获取回调(enqueue为异步请求,execute为同步请求(由于会阻塞线程,不建议使用))。
/**
* 普通的Get请求
*/
fun okHttpGet(view: View) {
val url = "http://www.baidu.com"
// 1.创建OkHttp实例
val okHttpClient = OkHttpClient()
// 2.构建请求参数 默认为get()请求,可以不写
val request = Request.Builder().url(url).get().build()
// 3.构建请求
val call = okHttpClient.newCall(request)
// 4.发送请求并获取回调(enqueue为异步请求,execute为同步请求(由于会阻塞线程,不建议使用))
call.enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Log.i("okHttp", "请求失败${
e.printStackTrace()}")
}
override fun onResponse(call: Call, response: Response) {
Log.i(
"okHttp",
response.protocol.toString() + " " + response.code + " " + response.message
)
val headers = response.headers
for (i in 0 until headers.size) {
Log.i("okHttp", headers.name(i) + ":" + headers.value(i))
}
Log.i("okHttp", "onResponse: " + response.body!!.string())
}
})
}
异步post请求
主要的步骤为:
(1)创建OkHttp实例。
(2)构建请求参数 默认为get()请求,可以不写。
(3)构建请求。
(4)发送请求并获取回调(enqueue为异步请求,execute为同步请求(由于会阻塞线程,不建议使用))。
/**
* Post方式提交String
*/
fun okHttpPost(view: View) {
val url = "http://www.5mins-sun.com:8081/user/direct_login"
//1.构建OkHttp实例
val okHttpClient = OkHttpClient()
//2.构建请求参数
val mediaType = "application/json; charset=utf-8".toMediaTypeOrNull()
val map = mutableMapOf<String, Any>()
map["phone"] = "13701659446"
val requestBody = Gson().toJson(map)
val request = Request.Builder().url(url).post(requestBody.toRequestBody(mediaType)).build()
//3.构建请求
val