工程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>>()