Android入门教程 | OkHttp 入门

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 【Android入门教程 | OkHttp 入门】创建代码片段
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 = https://www.it610.com/article/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() map["access_token"] = "0d6f65ef07976154138e126764303622" val file1Map = HashMap() file1Map["content"] = "# POST测试 \n rustfisher.com" val file2Map = HashMap() file2Map["content"] = "# 第二个文件 \n an.rustfisher.com" val filesMap = HashMap() 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入门教程 | OkHttp 入门
文章图片
【Android开发:框架源码解析视频参考】

    推荐阅读