OkHttp 是一款HTTP客户端。
特点:
- 连接池缩小申请提早(在HTTP/2不可用的状况下)
- 传输GZIP时缩小下载体积
- 缓存雷同申请的回复
OkHttp 能从连贯故障中静默复原。如果服务有多个 IP 地址,如果第一次拜访失败,它会尝试其余地址。 这性能对 IPv4+IPv6 和多个 host 的服务来说很有必要。
OkHttp反对古代TLS个性。
要求:
- 目前 OkHttp 要求 Android 5.0+ (API level 21+) ,或者Java 8+。
- OkHttp 依赖于 Okio 和 Kotlin 规范库。官网强烈建议咱们放弃 OkHttp 的更新。
- OkHttp 3.12.x 反对 Android 2.3+ (API level 9+) 和 Java 7+。
接下来介绍在Android开发中应用OkHttp。
Android引入依赖
先引入OkHttp依赖
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
以 Gitee 凋谢 API 为例 https://gitee.com/api/v5/swagger
,拿这里的接口做示例。须要筹备本人的 gitee 账号。
上面是 GET 和 POST 的实际操作,应用 Kotlin 开发。
GET
列出 star 了仓库的用户
这是个GET接口。url: https://gitee.com/api/v5/repos/rustfisher/AndroidTutorial/stargazers?page=1&per_page=20
用 curl 命令能够拿到获取后果
curl -X GET --header 'Content-Type: application/json;charset=UTF-8' 'https://gitee.com/api/v5/repos/rustfisher/AndroidTutorial/stargazers?page=1&per_page=20'
发动GET申请
private fun get1() {
val client = OkHttpClient()
val request = Request.Builder().url("https://gitee.com/api/v5/repos/rustfisher/AndroidTutorial/stargazers?page=1&per_page=20")
.build()
request.header("Content-Type: application/json;charset=UTF-8")
client.newCall(request).enqueue(object : Callback {
override fun onFailure(call: Call, e: IOException) {
Log.d(TAG, "[get1] onFailure: $call\n$e")
}
override fun onResponse(call: Call, response: Response) {
Log.d(TAG, "[get1] onResponse: $call\n$response")
if (response.code == 200) {
// 申请胜利 response.body!!.string()
}
}
})
}
- 创立 OkHttpClient 客户端对象
client
- 而后创立 Request 申请对象
request
- request 设置 header,
request.header("Content-Type: application/json;charset=UTF-8")
- 把申请交给客户端退出申请队列
enqueue(object : Callback)
办法能够传入一个 Callback 回调- 申请到的后果在
response.body
里
POST
创立代码片段
gitee有代码片段(gist)性能,以创立代码片段这个接口为例。
接口文档: https://gitee.com/api/v5/swagger#/postV5Gists
上面是接口形容
Parameter | Value | Description | Type | Data Type |
---|---|---|---|---|
access_token(必传) | (登录gitee取得) | 用户受权码 | formData | string |
files(必传) | 代码片段文件名及内容。如: | formData | object | |
description(必传) | 代码片段形容,1~30个字符 | formData | string | |
public | 公开/公有,默认: 公有 | formData | boolean |
相干代码
private fun post1() {
val mediaType = "application/json; charset=utf-8".toMediaType()
val client = OkHttpClient()
val postData = buildJson1()
val body = buildJson1().toString().toRequestBody(mediaType)
Log.d(TAG, "post1: $postData")
val request = Request.Builder().url("https://gitee.com/api/v5/gists")
.post(body)
.build()
val resp = client.newCall(request).execute() // 立即执行 会阻塞以后线程
if (resp.code >= 200 || resp.code <= 201) {
val resStr = resp.body!!.string()
Log.d(TAG, "post1: resp body: $resStr")
mHandler.post { binding.resTv.text = resStr }
}
}
private fun buildJson1(): JSONObject {
val map = HashMap<String, Any>()
map["access_token"] = "0d6f65ef07976154138e126764303622"
val file1Map = HashMap<String, Any>()
file1Map["content"] = "# POST测试 \n rustfisher.com"
val file2Map = HashMap<String, Any>()
file2Map["content"] = "# 第二个文件 \n an.rustfisher.com"
val filesMap = HashMap<String, Any>()
filesMap["file1"] = file1Map
filesMap["file2"] = file2Map
map["files"] = filesMap
map["description"] = "测试POST接口"
return JSONObject(map as Map<*, *>)
}
这里须要上报一些信息,用 JSONObject 装载信息。失去的 json 内容,再转成RequestBody。
最初交给 OkHttp 客户端去执行申请。留神这里要在子线程中操作。
Okhttp相干源码解析:
- Okhttp 申请流程
- RealCall#enqueue(Callback)
- RealInterceptorChain#proceed()
【Android开发:框架源码解析视频参考】
发表回复