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

如何用Ktor Resources插件定义POST请求及指定请求体结构?

用Ktor Resources实现POST端点+结构化请求体,并结合Content Negotiation

一、定义POST端点与请求体

Ktor Resources本身不直接在@Resource注解里指定HTTP方法,而是在路由绑定阶段通过post()方法明确指定。结合Content Negotiation可以自动处理JSON请求体的序列化/反序列化,步骤如下:

  1. 准备核心依赖
    确保项目引入必要依赖(以Gradle Kotlin DSL为例):
dependencies {
    implementation("io.ktor:ktor-server-resources:$ktorVersion")
    implementation("io.ktor:ktor-server-content-negotiation:$ktorVersion")
    implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
}
  1. 定义序列化请求体类
    创建带@Serializable注解的Review类,匹配请求体结构:
import kotlinx.serialization.Serializable

@Serializable
data class Review(
    val rating: Int,
    val review: String
)
  1. 用@Resource标注端点路径
    创建Resource类统一管理API路径:
import io.ktor.resources.Resource

@Resource("/api/submitReview")
class SubmitReview
  1. 绑定路由并处理POST请求
    在Ktor应用的路由配置中,绑定SubmitReview资源并指定POST方法,通过call.receive<Review>()自动解析JSON请求体:
import io.ktor.server.application.Application
import io.ktor.server.application.install
import io.ktor.server.plugins.contentnegotiation.ContentNegotiation
import io.ktor.server.plugins.resources.Resources
import io.ktor.server.resources.post
import io.ktor.server.response.respond
import io.ktor.serialization.kotlinx.json.json

fun Application.module() {
    // 安装Resources插件,管理路由结构
    install(Resources)
    // 安装Content Negotiation,配置JSON序列化
    install(ContentNegotiation) {
        json()
    }

    routing {
        // 绑定SubmitReview资源到POST请求
        post<SubmitReview> {
            // 自动将JSON请求体转为Review对象
            val review = call.receive<Review>()
            // 执行业务逻辑(如存储评论)
            // ...
            // 返回JSON响应
            respond(mapOf("status" to "success", "receivedRating" to review.rating))
        }
    }
}

二、简洁结合Resources与Content Negotiation

两者是天然互补的关系:

  • Resources负责统一管理API路径,让路由定义更类型安全,避免硬编码路径
  • Content Negotiation负责处理HTTP请求/响应的序列化逻辑,无需手动解析JSON字符串

不需要额外的复杂绑定,只要在应用启动时同时安装两个插件,在Resource绑定的路由中直接使用call.receive<T>()和respond(),就能自动完成JSON与Kotlin对象的互转。如果需要统一处理请求体验证等逻辑,可以封装通用的路由处理函数,但核心结合方式就是上述示例中的模式。

测试示例

用curl测试该端点:

curl -X POST http://localhost:8080/api/submitReview \
  -H "Content-Type: application/json" \
  -d '{"rating": 5, "review": "Great product!"}'

返回响应:

{"status":"success","receivedRating":5}

内容的提问来源于stack exchange,提问作者Vít Skalický

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 05:34:50