You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 12:47:18