如何用Ktor Resources插件定义POST请求及指定请求体结构?
用Ktor Resources实现POST端点+结构化请求体,并结合Content Negotiation
一、定义POST端点与请求体
Ktor Resources本身不直接在@Resource注解里指定HTTP方法,而是在路由绑定阶段通过post()方法明确指定。结合Content Negotiation可以自动处理JSON请求体的序列化/反序列化,步骤如下:
- 准备核心依赖
确保项目引入必要依赖(以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") }
- 定义序列化请求体类
创建带@Serializable注解的Review类,匹配请求体结构:
import kotlinx.serialization.Serializable @Serializable data class Review( val rating: Int, val review: String )
- 用
@Resource标注端点路径
创建Resource类统一管理API路径:
import io.ktor.resources.Resource @Resource("/api/submitReview") class SubmitReview
- 绑定路由并处理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ý
相关产品推荐
相关产品推荐

