Kotlin HTTP 客户端:从 A 到 Z 正确发出请求
\n现代 Kotlin 开发离不开与远程服务器的交互。无论是 Android 移动应用还是基于 Ktor 的服务器端解决方案,HTTP 请求都是数据交换的基础。在本文中,我们将探讨如何使用最佳实践、流行的库以及现代的协程方法来创建 Kotlin HTTP 客户端。您将学习如何发出 GET 和 POST 请求、处理错误、处理 JSON 以及构建可靠的网络层架构。
\n\n为什么 Kotlin 是 HTTP 客户端的理想选择?
\nKotlin 提供了简洁的语法、空安全(null safety)以及与 Java 生态系统的完全兼容性。得益于协程(coroutines),异步请求变得直观易懂,无需繁琐的回调。您可以编写顺序执行的代码,而它实际上是异步运行的——这大大简化了阅读和调试。此外,Kotlin 在 Android 开发中被广泛使用,而网络请求是日常任务。
\n\nKotlin 中主要的 HTTP 库
\n目前,最流行的有三种方法:
\n- \n
- Ktor Client — JetBrains 开发的跨平台客户端。支持 JVM、Android、iOS、JS 和 Native。非常适合需要统一代码库的项目。 \n
- OkHttp + Retrofit — Android/JVM 的经典技术栈。OkHttp 负责底层网络操作,而 Retrofit 生成类型化接口。 \n
- Fuel — 轻量级库,采用函数式方法。适合小型项目。 \n
在本文中,我们将重点介绍 Ktor 和 OkHttp,因为它们覆盖了 90% 的场景。
\n\n项目设置与首次请求
\n首先,添加依赖项。如果您使用 Gradle(Kotlin DSL),请添加 Ktor Client:
\ndependencies {\n implementation("io.ktor:ktor-client-core:2.3.7")\n implementation("io.ktor:ktor-client-cio:2.3.7") // CIO 引擎\n implementation("io.ktor:ktor-client-content-negotiation:2.3.7")\n implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.7")\n}\nOkHttp 的依赖项如下:
\ndependencies {\n implementation("com.squareup.okhttp3:okhttp:4.12.0")\n implementation("com.squareup.okhttp3:logging-interceptor:4.12.0")\n implementation("com.google.code.gson:gson:2.10.1")\n}\n\n使用 Ktor Client 发送 GET 请求
\n创建一个简单的客户端并向公共 API 发送 GET 请求:
\nimport io.ktor.client.*\nimport io.ktor.client.request.*\nimport io.ktor.client.statement.*\n\nsuspend fun fetchData(): String {\n val client = HttpClient()\n val response: HttpResponse = client.get("https://jsonplaceholder.typicode.com/posts/1")\n val body = response.bodyAsText()\n client.close()\n return body\n}\n\n// 在协程中使用\nfun main() = runBlocking {\n println(fetchData())\n}\n请注意:suspend 是 Kotlin 中用于挂起函数的关键字。这允许在不阻塞线程的情况下执行请求。
使用 OkHttp 发送 GET 请求
\n类似的 OkHttp 示例如下:
\nimport okhttp3.OkHttpClient\nimport okhttp3.Request\n\nfun fetchDataSync(): String {\n val client = OkHttpClient()\n val request = Request.Builder()\n .url("https://jsonplaceholder.typicode.com/posts/1")\n .build()\n client.newCall(request).execute().use { response ->\n return response.body?.string() ?: "错误"\n }\n}\n\n// 在普通线程中调用(阻塞式)\nfun main() {\n println(fetchDataSync())\n}\nOkHttp 默认是同步的,但可以通过 suspendCancellableCoroutine 轻松适配协程。
POST 请求与 JSON 处理
\n发送数据是第二个最重要的操作。让我们看看如何发送 JS