前言
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("\n\t")
append("header")
append("\n\t")
append(response.headers.joinToString("\n\t"))
append("\n\t")
append("body")
append("\n\t")
append("responseCode: ${response.code}")
append("\n\t")
append(
"content: ${
(response.body?.string() ?: "").let { s: String ->
//對獲取到的資料 簡單做一下格式化
s.split(",").joinToString("\n\t")
}
}"
)
}.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原始碼分析博客,覺得不錯關注博主哈~😎
創作不易,如有幫助一鍵三連咯🙆?♀?,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/393973.html
標籤:其他
上一篇:安卓訪問網路超時閃退
下一篇:移動開發—課后習題答案
