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请求,只需要三步。?

  1. 创建OkHttpClient
  2. 创建request 传入url
  3. 调用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源码分析博客。觉得不错关注博主哈~?

创作不易,如有帮助一键三连咯?‍♀️。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>