KMM 入门(七)处理 HTTP 网络请求

本文介绍了如何在 Kotlin Multiplatform(KMM)项目中使用 Ktor 进行网络通信,包括配置 Ktor、创建 HttpClient、发送 HTTP 请求以及处理响应。Ktor 支持多种平台,提供了与平台兼容的 HTTP 引擎,并可与 Kotlinx.Serialization 结合使用。文章还讨论了 Ktor 在 KMM 中的优势和潜在问题,建议根据项目需求选择合适的网络能力建设方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

与 Server 的数据交互已经成为 App 必不可少的一个重要部分,常用的方式即 HTTP(S),当然也有 WebSocket、TCP、UDP 等等

在 KMM 模块中,为保证双端逻辑一致,且对 JVM、Native 进行统一兼容,可以使用官方推荐的 Ktor 进行网络通信,Kotlinx.Serialization 来进行数据解析

这篇文章就来介绍在 KMM 中如何发起并处理网络请求,后面的文章再详细介绍 kotlinx.serialization 的使用

Ktor 是什么?

Ktor 是由 JetBrains 开发的一套用于解决各类应用中网络连接的框架,不仅可以用在发起请求的各类客户端(不是所谓的 App),还可以构建微服务

针对客户端能力,通过一系列插件,可以支持 HTTP 的各类特性,如:Cookies、重定向、代理、UA、WebSocket 等,在一定程度上,还可以支持一些简单的 TCP 或 UDP 通信

另外,Ktor 还支持为不同的平台配置不同的 HTTP 引擎,如:为 Android 配置 OkHttp 或 HttpURLConnection,为 iOS 配置 NSURLSession,或者为 JVM 配置 Apache HttpClient、为 JavaScript (Node.js) 配置 node-fetch,以便使用同一套代码逻辑处理网络请求

由于现在的 RESTful API 通常会以 JSON 作为通信数据格式,在 JVM 平台上,Ktor 还支持与 Gson、Jackson 协同工作,而对于 Kotlin Multiplatform(当然包括 KMM)可以与 kotlinx.serialization 进行协作

由于 Ktor 适用的平台广泛,本文只对 KMM 平台上的使用进行说明

为 KMM 模块配置 Ktor

如果你使用的 IDE 是 IntelliJ IDEA Ultimate 版本,可以考虑安装 Ktor 插件,但基于 Community 版本的 Android Studio 等 IDE 并不支持该插件,当然它对实际使用影响不大

对于 KMM 模块,首先需要在 Common 的依赖中加入 Ktor 的核心依赖

由于 Ktor 底层依赖协程一些核心功能,同时 Ktor 需要使用基于 Kotlin Native 且实现多线程版本的协程库,所以还需要加入对协程的依赖

// build.gradle.kts

// 2022 年 4 月,Ktor 正式发布了 2.0.0 版本
val ktor_version = "2.0.2"

// ...

val commonMain by getting {
   
   
    dependencies {
   
   
        implementation("io.ktor:ktor-client-core:$ktor_version")
    }
}

Android 模块中加入 Ktor Android 端默认引擎(使用 HttpURLConnection)的依赖

// build.gradle.kts

androidMain {
   
   
    dependencies {
   
   
        implementation("io.ktor:ktor-client-android:$ktor_version")
    }
}

如果需要使用 OkHttp 来作为 HTTP 能力的引擎,可以使用如下的依赖

// build.gradle.kts

androidMain {
   
   
    dependencies {
   
   
        implementation("io.ktor:ktor-client-okhttp:$ktor_version")
    }
}

另外,Android 端也可以使用 CIO(Coroutine(协程) based I/O 实现)引擎,但 CIO 目前还不支持 HTTP/2

对于 iOS,则加入 iOS 的引擎依赖,由于 iOS 的 HTTP 网络请求都是使用 NSURLSession(包括著名的 AFNetworking,NSURLConnection 早已经不用了),所以也就不像 Android 上有多种选择

// build.gradle.kts

iosMain {
   
   
    dependencies {
   
   
        implementation("io.ktor:ktor-client-darwin:$ktor_version")
    }
}

由于 Ktor 是 Kotlin 团队主要负责开发和维护,所以对 Kotlin 相关技术栈支持的比较友好,且部分技术应用的也比较激进,比如 Kotlin Native 的 New Memory Management,所以官方建议大家使用 Kotlin 协程,这就要求在宿主 App(Android 端)中添加协程相关的依赖

dependencies {
   
   
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1")
    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1")
}

Ktor 已经适配了 New Memory 技术,如果还需要开启 New Memory,则需要根据 New Memory 官方的文档要求,在 gradle.properties 文件中,添加以下的配置项

kotlin.native.binary.memoryModel=experimental

创建 Ktor 的 HttpClient

Ktor 中的 HttpClient 与其他 HTTP 框架类似,都是对发送和接收网络请求的一系列资源、配置的封装,请求与响应的操作方法,以 Extension 的形式表现,调用也非常简洁

在 Common 代码中,首先需要创建一个 HttpClient 的实例

val httpClient by lazy {
   
    HttpClient() }

如果不需要对 HttpClient 默认的引擎(根据 Gradle 中的依赖自动设置)进行特殊配置,以上代码足矣

为保障多平台的一致,在 Common 中的 HttpClient,对 engine 的可配置项非常有限,只有下面的 Proxy 和线程数量可配,同时可以支持一些公共的请求配置,写在 defaultRequest 闭包中即可,具体内容见下面一节

HttpClient {
   
   
    engine {
   
   
        proxy = ProxyBuilder.http("http://127.0.0.1:8888")
        threadsCount = 4
    }
    defaultRequest {
   
   
        // 可配置公共的 Cookies、Headers、Params
    }
}

如果需要针对不同的平台和不同的引擎的特性,进行一些自定义配置,则需要用到 expect/actual 的方式来实现 HttpClient

比如在 Android 代码中,针对 OkHttp 进行一些定制

actual val httpClient by lazy {
   
   
    HttpClient(OkHttp) {
   
   
        engine {
   
   
            config {
   
   
                // 禁止重定向
                followRedirects(false)
            }

            // 加入 Stetho 方便 Debug
            addNetworkInterceptor(StethoInterceptor())
        }
    }
}

或者对 iOS 的 NSURLSession 进行一些配置

actual val httpClient by lazy {
   
   
    HttpClient(Ios) {
   
   
        engine {
   
   
            configureRequest {
   
   
                // 如果 HttpClient 需要在后台进行上传、下载
                NSURLSessionConfiguration.backgroundSessionConfiguration("xxx").apply {
   
   
                    // 添加统一的 Headers
                    HTTPAdditionalHeaders = mapOf("a" to "b")
                }
            }
        
<think>嗯,用户现在想找Android开发从入门到高级的教程。我需要先理清楚他们的需求,可能是一个新手想要系统地学习Android开发,所以需要覆盖基础到高级的内容。首先,我应该考虑推荐的学习路径,分阶段进行,比如入门、进阶、高级,每个阶段需要掌握哪些技能和知识点。 然后,资源方面,用户可能需要官方文档、在线课程、书籍和实践项目。官方文档肯定是首要推荐的,比如Android Developers,这是最权威的来源。接下来,在线课程平台如Coursera、Udacity、B站这些可能有免费或付费的课程,需要提到一些具体的课程名称和链接。书籍方面,经典的《第一行代码》和《Android编程权威指南》应该包含在内,尤其是适合新手的。 实践项目部分,用户可能想知道如何应用所学知识,所以需要建议他们从简单的项目开始,逐步增加复杂度,比如Todo应用、天气应用,甚至开源项目。此外,工具和社区的支持也很重要,Android Studio是必备的开发工具,GitHub和Stack Overflow是解决问题和参与开源的好地方。 还要考虑用户可能遇到的问题,比如学习过程中遇到困难怎么办,所以推荐社区和论坛,让他们知道有地方可以求助。另外,版本问题,Android开发更新快,需要提醒用户关注最新动态,比如Jetpack Compose和Kotlin的推广。 可能需要检查推荐的资源是否仍然有效,链接是否正确。还要确保覆盖了最新的技术趋势,比如Kotlin作为首选语言,Jetpack库的使用,以及架构组件等。最后,生成相关问题,帮助用户进一步深入,比如性能优化、最新框架、跨平台开发等。</think>### Android开发学习路径推荐(入门至高级) #### 一、入门阶段 1. **开发环境搭建** - 安装Android Studio(官方IDE) - 配置Java/Kotlin开发环境(建议优先选择Kotlin) - 创建第一个"Hello World"项目 2. **基础核心知识** - Android四大组件:Activity、Service、BroadcastReceiver、ContentProvider - 基础UI开发:XML布局与View组件(Button、TextView等) - 简单事件处理:点击事件与页面跳转 - 推荐资源: - 官方文档《Android基础知识》[^1] - 《第一行代码(第3版)》(郭霖著) - Google Codelabs入门教程[^2] ```kotlin // 简单Activity示例 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) findViewById<Button>(R.id.btn_submit).setOnClickListener { startActivity(Intent(this, DetailActivity::class.java)) } } } ``` #### 二、进阶阶段 1. **高级UI开发** - 自定义View与动画实现 - RecyclerView高级用法 - 约束布局(ConstraintLayout)与响应式设计 2. **数据持久化** - Room数据库使用 - SharedPreferences - 文件存储 3. **网络编程** - Retrofit网络请求框架 - JSON解析(Gson/Moshi) - 协程/异步任务处理 4. **推荐资源** - Udacity《Android开发者》课程[^3] - 《Android编程权威指南》(第4版) - 官方架构组件文档[^4] $$ MVVM \ 架构模型: \ Model \leftrightarrow ViewModel \leftrightarrow View $$ #### 三、高级阶段 1. **架构设计** - MVVM/MVI架构实践 - 模块化开发 - 依赖注入(Hilt/Dagger) 2. **性能优化** - 内存泄漏检测(LeakCanary) - 启动速度优化 - APK体积缩减 3. **新兴技术** - Jetpack Compose声明式UI - Kotlin协程与Flow - 跨平台开发(KMM) 4. **推荐资源** - Google I/O大会技术视频[^5] - 《Kotlin实战》中文版 - Android开发者博客[^6] #### 四、实战提升 1. **项目实践建议** - 初级项目:Todo清单、天气应用 - 中级项目:电商APP原型、即时通讯工具 - 高级项目:完整商业级应用开发 2. **开源参与** - GitHub热门Android项目分析 - 参与Apache开源项目 - 定期阅读源码(如Google Samples)
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值