kotlin版Http请求

1,416 阅读1分钟

主要目标:

  • 使用kotlin+OkHttp3实现,发起http请求,同步处理响应数据和异步处理响应数据;
  • 使用gson实现字符串反序列化和序列化;
  • 使用线程池去执行;
  • 为后续编写kotlin版本的下载器做知识储备;

maven配置文件

<dependencies>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-test-junit5</artifactId>
        <version>1.7.10</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.8.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.jetbrains.kotlin</groupId>
        <artifactId>kotlin-stdlib-jdk8</artifactId>
        <version>1.7.10</version>
    </dependency>
    <dependency>
        <groupId>com.squareup.retrofit2</groupId>
        <artifactId>retrofit</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>com.squareup.retrofit2</groupId>
        <artifactId>converter-gson</artifactId>
        <version>2.9.0</version>
    </dependency>
    <dependency>
        <groupId>com.squareup.okhttp3</groupId>
        <artifactId>logging-interceptor</artifactId>
        <version>4.10.0</version>
    </dependency>
</dependencies>

测试主类

package com.jack.demo

import com.jack.demo.thread.TaskOne
import java.util.concurrent.LinkedBlockingDeque
import java.util.concurrent.ThreadPoolExecutor
import java.util.concurrent.TimeUnit

fun main(args: Array<String>) {
    //线程池
    val pool = ThreadPoolExecutor(
        2, 200,
        120L, TimeUnit.SECONDS,
        LinkedBlockingDeque<Runnable>(),//无界,FIFO队列
        ThreadPoolExecutor.AbortPolicy()
    );

    println("******************线程")

    for (index in 1..1) {
        pool.execute(TaskOne())
    }
    TimeUnit.SECONDS.sleep(1L)
    println("******************")
}

样例请求并解析:

import com.google.gson.Gson
import com.google.gson.JsonObject
import okhttp3.*
import java.io.IOException

class TaskOne : Thread() {
    val gson: Gson = Gson()
    override fun run() {
        var url: String = "http://127.0.0.1:8090/xxoo/path/play"
        //请求参数Map
        var jsonObj = JsonObject()
        jsonObj.addProperty("roomId", "1562041467716960258")
        jsonObj.addProperty("subjectId", "1557607618707628034")
        jsonObj.addProperty("sceneNo", 1)

        //请求体封装
        val requestBody: RequestBody = RequestBody.create(
            MediaType.parse("application/json;charset=UTF-8"),
            jsonObj.toString().encodeToByteArray()
        )

        var builder = Request.Builder()
        builder.url(url)
            .post(requestBody)

        val client = OkHttpClient()
        var response: Response = client.newCall(builder.build()).execute()
        var responseStr = response.body()?.string()
        println("同步处理->响应数据:" + responseStr)
        //字符串装map对象
        var resultMap: Map<String, Any> = HashMap()
        resultMap = Gson().fromJson(responseStr, resultMap.javaClass)
        println("json字符串转换为map类型" + resultMap.toString())

        /**
         * 请求结果异步处理
         */
        client.newCall(builder.build()).enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                println("异步处理->请求失败")
            }

            override fun onResponse(call: Call, response: Response) {
                var stA = response.body()!!.string()
                println("异步处理->请求成功 响应数据:$stA")
            }
        })
    }
}