OkHttp初探:如何使用OkHttp进行Get或Post请求?Kotlin版本。

Posted pumpkin的玄学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("\\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请求,只需要三步。👀

  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源码分析博客。觉得不错关注博主哈~😎

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

以上是关于OkHttp初探:如何使用OkHttp进行Get或Post请求?Kotlin版本。的主要内容,如果未能解决你的问题,请参考以下文章

如何指定 Get-Request 编码(Retrofit + OkHttp)

[技术博客]OKhttp3使用get,post,delete,patch四种请求

[技术博客]OKhttp3使用get,post,delete,patch四种请求

Okhttp 使用(同步、异步/get、post/上传文件)

Android网络请求框架—OKHttp 源码解析

okhttp3使用