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

如何在Ktor后端中调用第三方Web API?

在Ktor中调用外部Web API(替代Spring Boot的RestTemplate)

在Ktor中,官方推荐使用HttpClient来实现外部API调用,这和Spring Boot里的RestTemplate功能对等,下面是具体实现步骤:

1. 添加依赖

首先在项目构建文件中引入HttpClient相关依赖,以Gradle Kotlin DSL为例:

dependencies {
    // 基础HttpClient核心依赖
    implementation("io.ktor:ktor-client-core:$ktor_version")
    // 选择HTTP引擎,这里用兼容性较好的OkHttp
    implementation("io.ktor:ktor-client-okhttp:$ktor_version")
    // 若需处理JSON序列化/反序列化,添加以下依赖
    implementation("io.ktor:ktor-client-content-negotiation:$ktor_version")
    implementation("io.ktor:ktor-serialization-kotlinx-json:$ktor_version")
}

注意将$ktor_version替换为你实际使用的Ktor版本(如2.3.3)。

2. 创建全局HttpClient实例

建议创建单例HttpClient,避免重复初始化资源:

import io.ktor.client.*
import io.ktor.client.engine.okhttp.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.serialization.json.Json

// 全局单例HttpClient
val httpClient = HttpClient(OkHttp) {
    // 安装JSON内容协商插件,自动处理序列化
    install(ContentNegotiation) {
        json(Json {
            prettyPrint = true
            isLenient = true
            ignoreUnknownKeys = true // 忽略API返回中未定义的字段
        })
    }
    // 配置HTTP引擎参数,比如超时
    engine {
        config {
            connectTimeout(10, java.util.concurrent.TimeUnit.SECONDS)
            readTimeout(10, java.util.concurrent.TimeUnit.SECONDS)
        }
    }
}

3. 发起各类外部API请求

GET请求(获取JSON数据)

先定义对应API返回的数据类:

import kotlinx.serialization.Serializable

@Serializable
data class User(val id: Int, val name: String, val email: String)

然后编写请求函数:

import io.ktor.client.request.*
import io.ktor.http.*

suspend fun fetchRemoteUsers(): List<User> {
    return httpClient.get("https://api.example.com/users") {
        // 添加请求头,比如授权信息
        headers {
            append(HttpHeaders.Authorization, "Bearer your_access_token")
        }
        // 可添加URL参数:parameter("page", 1)
    }
}

POST请求(发送JSON数据)

suspend fun createRemoteUser(newUser: User): User {
    return httpClient.post("https://api.example.com/users") {
        contentType(ContentType.Application.Json)
        setBody(newUser) // 自动序列化User对象为JSON
    }
}

表单提交请求

import io.ktor.client.request.forms.*

suspend fun submitLoginForm(username: String, password: String): String {
    return httpClient.submitForm("https://api.example.com/login") {
        parameter("username", username)
        parameter("password", password)
    }
}

4. 在Ktor路由中集成

在你的Ktor应用路由里,调用上述函数来响应用户请求:

import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*

fun Application.configureRouting() {
    routing {
        // 用户请求此接口时,后端调用外部API获取数据并返回
        get("/proxy/users") {
            val remoteUsers = fetchRemoteUsers()
            call.respond(remoteUsers)
        }

        // 用户提交数据后,后端调用外部API创建资源
        post("/proxy/users") {
            val userToCreate = call.receive<User>()
            val createdUser = createRemoteUser(userToCreate)
            call.respond(createdUser)
        }
    }
}

参考问题(原英文翻译):如何在我的Spring Boot服务器中调用另一个REST API?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:45:38