Skip to content
Server Plugin

DoubleReceive

所需依赖项io.ktor:ktor-server-double-receive

代码示例 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
}