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
相关产品推荐
相关产品推荐

