Skip to content
Server Plugin

DoubleReceive

所需依赖项: <code>io.ktor:ktor-server-double-receive</code>

代码示例: double-receive

原生服务器
Ktor 支持 Kotlin/Native,无需额外的运行时或虚拟机即可运行服务器。
支持: ✅

DoubleReceive 插件提供了多次接收请求体的能力,且不会抛出 RequestAlreadyConsumedException 异常。如果某个插件已经消费了请求体,导致你无法在路由处理函数内部接收它,那么此功能会很有用。例如,你可以使用 DoubleReceive 通过 CallLogging 插件来记录请求体日志,然后再次在 post 路由处理函数内部接收请求体。

DoubleReceive 插件使用了一个实验性的 API,预计在即将到来的更新中会有所演进,并可能包含破坏性变更。

添加依赖项

要使用 `DoubleReceive`,你需要在构建脚本中包含 `ktor-server-double-receive` 构件:

Kotlin
Groovy
XML

安装 DoubleReceive

要将 `DoubleReceive` 插件安装到应用程序,请在指定的

模块
模块允许你通过对路由进行分组来组织应用程序。
中将其传递给 `install` 函数。以下代码片段展示了如何安装 `DoubleReceive` ...

  • ... 在 `embeddedServer` 函数调用内部。
  • ... 在显式定义的 `module` 内部,这是一个 `Application` 类的扩展函数。
kotlin
kotlin

`DoubleReceive` 插件也可以安装到特定路由。如果你需要针对不同的应用程序资源使用不同的 `DoubleReceive` 配置,这可能会很有用。

安装 DoubleReceive 后,你可以多次接收请求体,并且每次调用都会返回相同的实例。例如,你可以使用 CallLogging 插件启用请求体日志记录...

kotlin
install(CallLogging) {
    level = Level.TRACE
    format { call ->
        runBlocking {
            "Body: ${call.receiveText()}"
        }
    }
}

... 然后在路由处理函数内部再次获取请求体。

kotlin
post("/") {
    val receivedText = call.receiveText()
    call.respondText("Text '$receivedText' is received")
}

你可以在此处找到完整示例:double-receive

配置 DoubleReceive

在默认配置下,DoubleReceive 提供了以以下类型接收请求体的能力:

  • ByteArray
  • String
  • Parameters
  • ContentNegotiation 插件使用的数据类

默认情况下,DoubleReceive 不支持:

  • 从同一个请求中接收不同类型;
  • 接收流或通道

如果你无需从同一个请求中接收不同类型,或无需接收流或通道,请将 cacheRawRequest 属性设置为 false

kotlin
install(DoubleReceive) {
    cacheRawRequest = false
}