使用Kotlin重新构建OkHttpUtils
由于使用Kotlin的时间越来越多,也学会了一些可以提高编写代码效率的小技巧下面参试使用几个kotlin特性重新编写OkHttp的工具类。
- 通过使用object关键字创建一个
OkHttpUtilsByKotlin
单例类 - 通过高阶函数将接口数据进行回调,因为请求分为
onFailure
和onResponse
两个状态于是我们定义如下两个高阶函数
success: (Response) -> Unit
和failed: (Exception) -> Unit
成功即调用success否则failed. - 最关键的一步在于使用
object
关键字将okhttp 中 callback接口实现如下代码所示,在实现此接口后分别把两个高阶函数在对于方法进行调用即可。 - 最后就是和平常的构建okhttp的访问是一样的通过
okHttpClient.newCall(request).enqueue(callback)
我们就把callback传入到了方法中。 - 展示一下如何调用
OkHttpUtilsByKotlin.postRequest("http://10.0.2.2:8099/user/register", json,
{ success ->
println(success.body?.string())
},
{ failed ->
})
本文写的粗糙,若存在某些问题欢迎各位指正。
附上完整代码
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody
import java.io.IOException
import java.lang.Exception
import kotlin.concurrent.thread
/**
* create by ZyiqueChou on 04/26/2022
* rebuild okhttp utils
*/
object OkHttpUtilsByKotlin {
private val okHttpClient = OkHttpClient()
private val JSON = "application/json; charset=utf-8".toMediaType()
fun getRequest(url: String, success: (Response) -> Unit, failed: (Exception) -> Unit) {
thread {
val callback = object : Callback {
override fun onFailure(call: Call, e: IOException) {
failed(e)
}
override fun onResponse(call: Call, response: Response) {
success(response)
}
}
val request = Request.Builder()
.url(url)
.build()
okHttpClient.newCall(request).enqueue(callback)
}
}
fun postRequest(
url: String,
json: String,
success: (Response) -> Unit,
failed: (Exception) -> Unit
) {
thread {
val callback = object : Callback {
override fun onFailure(call: Call, e: IOException) {
failed(e)
}
override fun onResponse(call: Call, response: Response) {
success(response)
}
}
val requestBody = json.toRequestBody(JSON)
val request = Request.Builder()
.url(url)
.post(requestBody)
.build()
okHttpClient.newCall(request).enqueue(callback)
}
}
}