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

Kotlin Multiplatform桌面端(Compose for Desktop)HTTP请求实现方法及学习资源咨询

嘿,作为KMP新手直接上手Compose for Desktop真的挺赞的!关于在这个技术栈里实现HTTP请求,咱们KMP生态有几个特别顺手的方案,我给你拆解下实操步骤和学习资源:

首选方案:Ktor Client(JetBrains官方推荐)

Ktor Client是JetBrains自家的跨平台网络库,和Kotlin、Compose的适配度拉满,不管是Desktop还是移动端,代码都能共享,非常适合KMP项目。

1. 添加依赖配置

先在你的build.gradle.kts里配置好依赖,注意区分common(跨平台共享)和desktop(桌面平台专属)的依赖:

plugins {
    kotlin("multiplatform")
    id("org.jetbrains.compose")
    kotlin("plugin.serialization") version "1.9.20" // 需要序列化插件解析JSON
}

kotlin {
    jvm("desktop") {
        compilations.all {
            kotlinOptions.jvmTarget = "17"
        }
        withJava()
    }
    
    sourceSets {
        val desktopMain by getting
        val commonMain by getting {
            dependencies {
                // Ktor核心依赖
                implementation("io.ktor:ktor-client-core:2.3.7")
                // 内容协商(用来解析JSON)
                implementation("io.ktor:ktor-client-content-negotiation:2.3.7")
                // Kotlinx序列化JSON转换器
                implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0")
            }
        }
        desktopMain.dependencies {
            implementation(compose.desktop.currentOs)
            // Desktop平台用CIO引擎,也可以换成OkHttp引擎
            implementation("io.ktor:ktor-client-cio:2.3.7")
        }
    }
}

2. 编写请求代码

首先定义一个对应API返回的序列化数据类,然后创建Ktor Client实例,最后在Compose界面里发起请求:

// 序列化数据类,和API返回的字段对应
@Serializable
data class Post(
    val id: Int,
    val title: String,
    val body: String,
    val userId: Int
)

// 创建全局的Ktor Client单例(避免重复创建)
val ktorClient = HttpClient(CIO) {
    install(ContentNegotiation) {
        json(Json {
            prettyPrint = true
            ignoreUnknownKeys = true // 忽略API里没定义的字段,防止解析失败
        })
    }
    // 还可以配置超时、拦截器、认证等,比如:
    // install(HttpTimeout) {
    //     requestTimeoutMillis = 10000
    // }
}

// Compose界面示例
@Composable
fun HttpRequestDemo() {
    var posts by remember { mutableStateOf<List<Post>>(emptyList()) }
    var isLoading by remember { mutableStateOf(false) }
    // 用rememberCoroutineScope在Compose里启动协程
    val scope = rememberCoroutineScope()

    Column(Modifier.padding(16.dp)) {
        Button(onClick = {
            scope.launch {
                isLoading = true
                try {
                    // 发起GET请求,自动解析成List<Post>
                    posts = ktorClient.get("https://jsonplaceholder.typicode.com/posts")
                } catch (e: Exception) {
                    // 这里可以处理错误,比如弹提示框或者打印日志
                    println("请求出错啦:${e.message}")
                } finally {
                    isLoading = false
                }
            }
        }) {
            Text(if (isLoading) "加载中..." else "获取帖子列表")
        }

        if (isLoading) {
            CircularProgressIndicator(Modifier.padding(top = 16.dp))
        } else {
            LazyColumn(Modifier.padding(top = 16.dp)) {
                items(posts) { post ->
                    Card(
                        modifier = Modifier
                            .fillMaxWidth()
                            .padding(vertical = 8.dp),
                        elevation = CardDefaults.cardElevation(4.dp)
                    ) {
                        Column(Modifier.padding(12.dp)) {
                            Text(post.title, style = MaterialTheme.typography.titleMedium)
                            Spacer(Modifier.height(4.dp))
                            Text(post.body, style = MaterialTheme.typography.bodyMedium)
                        }
                    }
                }
            }
        }
    }
}

小提醒

HTTP请求是挂起函数,必须在协程里调用!Compose里可以用rememberCoroutineScope或者LaunchedEffect,千万别直接在Button的onClick里调用挂起函数哦~

备选方案:Retrofit + Kotlin Serialization

如果你之前在Android开发里用过Retrofit,那这个方案上手会特别快,它同样支持跨平台,配合Kotlin Serialization解析JSON也很顺畅。

1. 添加依赖

// 在commonMain的dependencies里添加
implementation("com.squareup.retrofit2:retrofit:2.9.0")
implementation("com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0")
// desktopMain里添加OkHttp客户端依赖
implementation("com.squareup.okhttp3:okhttp:4.11.0")

2. 编写请求代码

// 同样用之前的Post数据类(记得加@Serializable注解)

// 定义API接口
interface PostsApi {
    @GET("posts")
    suspend fun getPosts(): List<Post>
}

// 创建Retrofit实例
val retrofit = Retrofit.Builder()
    .baseUrl("https://jsonplaceholder.typicode.com/")
    .addConverterFactory(KotlinxSerializationConverter(Json { ignoreUnknownKeys = true }))
    .client(OkHttpClient.Builder().build())
    .build()

// 创建API接口实例
val postsApi = retrofit.create(PostsApi::class.java)

// Compose界面调用(和Ktor的UI逻辑差不多)
@Composable
fun RetrofitDemo() {
    var posts by remember { mutableStateOf<List<Post>>(emptyList()) }
    var isLoading by remember { mutableStateOf(false) }
    val scope = rememberCoroutineScope()

    Column(Modifier.padding(16.dp)) {
        Button(onClick = {
            scope.launch {
                isLoading = true
                try {
                    posts = postsApi.getPosts()
                } catch (e: Exception) {
                    println("请求失败:${e.message}")
                } finally {
                    isLoading = false
                }
            }
        }) {
            Text(if (isLoading) "加载中..." else "用Retrofit获取帖子")
        }

        // UI展示部分和之前的示例一致,这里就不重复啦
    }
}
实用学习资源
  • Ktor Client官方指南:JetBrains官方出品,从基础配置到高级特性(比如拦截器、认证、超时)都讲得很透彻,适合系统学习
  • Kotlin Multiplatform官方教程:里面有专门的网络请求章节,结合KMP跨平台特性讲解如何共享网络代码
  • Compose for Desktop官方示例:官方仓库里有带网络请求的完整项目,可以直接clone下来运行调试,直观学习
  • Kotlin Serialization官方文档:如果需要处理复杂JSON结构,这个文档能帮你搞定各种序列化场景
  • 社区实战文章:很多KMP开发者会分享Compose Desktop的网络请求实战经验,搜相关关键词就能找到不少实用内容

内容的提问来源于stack exchange,提问作者Karim Sinouh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:42:39