关于android:Android入门教程-OkHttp-入门

42次阅读

共计 2918 个字符,预计需要花费 8 分钟才能阅读完成。

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 开发:框架源码解析视频参考】

正文完
 0