Kotlin Multiplatform Mobile中初始化HTTPClient报错,如何解决?
解决KMM中HttpClient初始化错误的方案
1. 配置Ktor依赖
在共享模块的build.gradle.kts中添加Ktor客户端核心及各平台引擎依赖(版本建议使用最新稳定版,示例用2.3.11):
plugins { kotlin("multiplatform") id("com.android.library") kotlin("plugin.serialization") version "1.9.23" } kotlin { androidTarget() iosX64() iosArm64() iosSimulatorArm64() sourceSets { val commonMain by getting { dependencies { // Ktor核心依赖 implementation("io.ktor:ktor-client-core:2.3.11") // 内容协商(用于JSON序列化) implementation("io.ktor:ktor-client-content-negotiation:2.3.11") // Kotlinx JSON序列化 implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.11") } } val androidMain by getting { dependencies { // Android平台引擎 implementation("io.ktor:ktor-client-android:2.3.11") } } val iosMain by creating { dependsOn(commonMain) dependencies { // iOS平台引擎 implementation("io.ktor:ktor-client-ios:2.3.11") } } // 其他iOS架构源集依赖iosMain val iosX64Main by getting { dependsOn(iosMain) } val iosArm64Main by getting { dependsOn(iosMain) } val iosSimulatorArm64Main by getting { dependsOn(iosMain) } } }
2. 用Expect/Actual创建平台适配的HttpClient
KMM中不能直接无参初始化HttpClient(),需通过跨平台抽象定义:
共享模块(commonMain)
import io.ktor.client.HttpClient expect fun createHttpClient(): HttpClient
Android平台模块(androidMain)
import io.ktor.client.HttpClient import io.ktor.client.engine.android.Android import io.ktor.client.plugins.contentnegotiation.ContentNegotiation import io.ktor.serialization.kotlinx.json.json import kotlinx.serialization.json.Json actual fun createHttpClient(): HttpClient = HttpClient(Android) { install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true // 忽略接口返回中未定义的字段 isLenient = true }) } }
iOS平台模块(iosMain)
import io.ktor.client.HttpClient import io.ktor.client.engine.ios.Ios import io.ktor.client.plugins.contentnegotiation.ContentNegotiation import io.ktor.serialization.kotlinx.json.json import kotlinx.serialization.json.Json actual fun createHttpClient(): HttpClient = HttpClient(Ios) { install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true isLenient = true }) } }
3. 修正ApiService实现
注意:https://fakestoreapi.com/products/1返回的是单个商品对象,不是列表,需修正返回类型;同时确保数据类可序列化:
定义可序列化的数据类(commonMain)
import kotlinx.serialization.Serializable @Serializable data class ProductModal( val id: Int, val title: String, val price: Double, val description: String, val category: String, val image: String, val rating: Rating ) @Serializable data class Rating( val rate: Double, val count: Int )
修正ApiService
class ApiService() { private val httpClient = createHttpClient() suspend fun fetchData(): ProductModal { return httpClient.get("https://fakestoreapi.com/products/1") } }
4. 同步项目并构建
点击IDE的"Sync Project with Gradle Files",然后重新构建项目,即可解决初始化错误。
内容的提问来源于stack exchange,提问作者KARTHIK
相关产品推荐
相关产品推荐

