Android 集成Ktor

工程build.gradle.kts中

 alias(libs.plugins.kotlin.parcelize) apply false

app build.gradle.kts 中

   implementation(libs.ktor.client.logging)
    implementation(libs.ktor.client.core)
    implementation(libs.ktor.client.cio)
    implementation(libs.ktor.client.content.negotiation)
    implementation(libs.ktor.serialization.gson)

libs.versions.toml 中

ioKtorKtorClient = "3.1.2"
ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktorClientCore" }
ktor-client-core = { module = "io.ktor:ktor-client-core", version.ref = "ktorClientCore" }
ktor-client-logging = { module = "io.ktor:ktor-client-logging", version.ref = "ioKtorKtorClient" }
ktor-client-cio = { module = "io.ktor:ktor-client-android", version.ref = "ioKtorKtorClient" }
ktor-serialization-gson = { module = "io.ktor:ktor-serialization-gson", version.ref = "ktorClientCore" }

ktor 初始化

    private val client = HttpClient(Android) {
        expectSuccess = false
        install(Logging) {
            logger = unicodeLogger
            level = LogLevel.ALL
        }
        install(ContentNegotiation) {
            gson()
        }
        HttpResponseValidator {
            validateResponse { response ->
                val statusCode = response.status.value
                if (statusCode !in 200..299) {
                    throw Exception("HTTP 请求失败,状态码: $statusCode, 路径: ${response.request.url}")
                }
            }
        }
    }

中文打印转码问题, 如果无需考虑, logger = Logger.ANDROID 即可

    private val unicodeLogger = object : Logger {
        override fun log(message: String) {
            addLogContent(decodeUnicode(message))
        }

        private fun decodeUnicode(input: String): String {
            return input.replace(Regex("\\\\u([0-9a-fA-F]{4})")) {
                it.groupValues[1].toInt(16).toChar().toString()
            }
        }
    }

如果不需要拦截特定code

expectSuccess = true
HttpResponseValidator {
    handleResponseExceptionWithRequest { exception, request ->
        when (exception) {
            is ServerResponseException -> {
                val errorMsg = "服务端错误:${exception.response.status}"
                addLogContent(errorMsg)
                throw Exception(errorMsg, exception)
            }
            is ClientRequestException -> {
                val errorMsg = "客户端请求异常:${exception.response.status}"
                addLogContent(errorMsg)
                throw Exception(errorMsg, exception)
            }
            else -> throw exception
        }
    }
}

接口请求, 使用json 的post请求

val response =
                client.post("http://apis.******") {
                    contentType(ContentType.Application.Json.withCharset(charset = Charset.defaultCharset()))
                    setBody(
                        DayDetailInput(
                            input = day,
                            dialogHistory = dialogHistory ?: getTargetDialogHistory(conversationId)
                        )
                    )
                }.body<DetailResponse<DetailTravel>>()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容