OkHttp初探:如何使用OkHttp进行Get或Post请求?Kotlin版本。
前言
OkHttp 是一个高效的 HTTP 客户端:
以下引用官网介绍
HTTP/2 support allows all requests to the same host to share a socket.
Connection pooling reduces request latency (if HTTP/2 isn’t available).
Transparent GZIP shrinks download sizes.
Response caching avoids the network completely for repeat requests.
HTTP/2 支持允许对同一主机的所有请求共享一个套接字。
连接池减少了请求延迟(如果 HTTP/2 不可用)。
透明 GZIP 缩小下载大小。
响应缓存完全避免网络重复请求。
本博客引用的okhttp版本:com.squareup.okhttp3:okhttp:4.9.0
基础使用
GET请求
下面代码将请求博主GitHub账户公开信息,并且打印。?♀️
simpleGetUse("https://api.github.com/users/zhangnangua")
fun simpleGetUse(url: String) {
//创建OkHttpClient
val okHttpClient = OkHttpClient()
//构建request
val requestBuilder = Request.Builder().url(url)
//调用newCall 返回call对象,此后调用enqueue进行异步请求
okHttpClient.newCall(requestBuilder.build()).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
log("go failure ${e.message}")
}
override fun onResponse(call: Call, response: Response) {
val msg = if (response.isSuccessful) {
simpleDealData(response)
} else {
"failure ${response.message}"
}
log(msg)
}
})
}
//该函数用于简单处理返回的信息,这里放一次,下面就不放了。
private fun simpleDealData(response: Response): String = StringBuilder().apply {
append("nt")
append("header")
append("nt")
append(response.headers.joinToString("nt"))
append("nt")
append("body")
append("nt")
append("responseCode: ${response.code}")
append("nt")
append(
"content: ${
(response.body?.string() ?: "").let { s: String ->
//对获取到的数据 简单做一下格式化
s.split(",").joinToString("nt")
}
}"
)
}.toString()
结果。?
...
(X-RateLimit-Resource, core)
(X-RateLimit-Used, 1)
(Accept-Ranges, bytes)
(X-GitHub-Request-Id, 3781:8EFC:1754277:1870E61:61C85330)
body
responseCode: 200
content: {"login":"zhangnangua"
"name":"pumpkin"
"bio":"pumpkin偶尔相信玄学???"
...
如果要进行get请求,只需要三步。?
- 创建OkHttpClient
- 创建request 传入url
- 调用OkHttpClient 的newCall()返回call对象,此后调用enqueue进行异步请求,当然也可以使用execute进行同步请求,博主这里就不进行测试了。
POST请求
post传递会存在两种格式,表格和JSON形式,代码在下面放出来。
另:博主没有搭建接口,就不放测试结果了,大家可以自行复制代码测试。?♀️
post 表格格式
fun simplePostUseFrom(url: String, params: Map<String, String>? = null) {
//创建 formBody
val formBody = FormBody.Builder()
.also { builder ->
params?.forEach { (name, value) ->
//参数需要 add 进入FormBody.Builder
builder.add(name, value)
}
}.build()
val okHttpClient = OkHttpClient()
val request = Request.Builder()
.url(url)
.post(formBody) //注意:此时formBody以post的形式传入
.build()
okHttpClient.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
log("go failure ${e.message}")
}
override fun onResponse(call: Call, response: Response) {
val msg = if (response.isSuccessful) {
simpleDealData(response)
} else {
"failure code:${response.code} message:${response.message}"
}
log(msg)
}
})
}
注意:?
- 需要新增一个FromBody对象,参数保存在FromBody中
- 将FromBody以post的形式传递到Request中
- 其他的和get保持一致即可
post json格式
fun simplePostUseJson(url: String, jsonStr: String? = null) {
val requestBody = jsonStr?.let {
//创建requestBody 以json的形式
val contentType: MediaType = "application/json; charset=utf-8".toMediaType()
jsonStr.toRequestBody(contentType)
} ?: run {
//如果参数为null直接返回null
FormBody.Builder().build()
}
val okHttpClient = OkHttpClient.build()
val request = Request.Builder()
.url(url)
.post(requestBody) //以post的形似 添加requestBody
.build()
okHttpClient.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
log("go failure ${e.message}")
}
override fun onResponse(call: Call, response: Response) {
val msg = if (response.isSuccessful) {
simpleDealData(response)
} else {
"failure code:${response.code} message:${response.message}"
}
log(msg)
}
})
}
注意:?
- RequestBody对象创建方式和表格的不一样,其他的一样即可
后面会陆续推出OkHttp高阶使用,以及OkHttp源码分析博客。觉得不错关注博主哈~?
创作不易,如有帮助一键三连咯?♀️。