ktor封装
代码如下:
Kotlin
object KtorClient {
// private const val BASE_URL = "http://***.**.***.62:8002"
private const val BASE_URL = "https://mock.***.cn"
val client = HttpClient(CIO) {
install(ContentNegotiation) {
json(Json {
prettyPrint = true
isLenient = true
})
}
install(HttpTimeout) {
requestTimeoutMillis = 10000
}
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.NONE
}
install(DefaultRequest) {
url(BASE_URL)
}
// install(HttpRequestRetry) {
// maxRetries = 1
// retryIf { request, response ->
// response.status.value in listOf(408, 429, 500, 502, 503)
// }
// retryOnExceptionIf { _, exception ->
// exception is SocketTimeoutException || exception is ConnectException || exception is UnresolvedAddressException
// }
// delayMillis { retry ->
// retry * 3000L
// }
// }
}
fun close() {
client.close()
}
inline fun <reified T> get(url: String, params: Map<String, String> = emptyMap()): Flow<T> {
return flow {
val response = client.get(url) {
params.forEach { parameter(it.key, it.value) }
}
val result = response.body<T>()
emit(result)
}.catch { throwable: Throwable ->
throw throwable
}.onCompletion { cause ->
close()
}.flowOn(Dispatchers.IO)
}
inline fun <reified T> post(url: String, params: Map<String, String> = emptyMap()): Flow<T> {
return flow {
val response = client.post(url) {
params.forEach { parameter(it.key, it.value) }
}
val result = response.body<T>()
emit(result)
}.catch { throwable: Throwable ->
throw throwable
}.onCompletion { cause ->
close()
}.flowOn(Dispatchers.IO)
}
}
请求:
Kotlin
Log.e("TAG", "111开始请求网络")
KtorClient.get<BaseResponse<List<String>>>(
"m1/****/api/user",
hashMapOf("id" to "1")
).collect {
Log.e("TAG", "请求结果=》$it")
}
依赖引入:
Kotlin
/**************************/
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.2.0' // lifecycleScope
def ktor_version = "2.3.1"
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1'
//observe livedata as state
implementation 'androidx.compose.runtime:runtime-livedata:1.2.0-alpha07'
//google sign in
implementation 'com.google.android.gms:play-services-auth:20.1.0'
//ktor
implementation "io.ktor:ktor-client-auth:$ktor_version"
implementation "io.ktor:ktor-client-core:$ktor_version"
implementation "io.ktor:ktor-client-logging:$ktor_version"
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor_version")
implementation("io.ktor:ktor-client-cio:$ktor_version")
implementation("io.ktor:ktor-client-content-negotiation:$ktor_version")
implementation "ch.qos.logback:logback-classic:1.2.10"
// implementation("io.ktor:ktor-client-features:$ktor_version")
/******************************/