DoubleReceive
所需依赖项: <code>io.ktor:ktor-server-double-receive</code>
代码示例: double-receive
DoubleReceive
插件提供了多次接收请求体的能力,且不会抛出 RequestAlreadyConsumedException
异常。如果某个插件已经消费了请求体,导致你无法在路由处理函数内部接收它,那么此功能会很有用。例如,你可以使用 DoubleReceive
通过 CallLogging 插件来记录请求体日志,然后再次在 post
路由处理函数内部接收请求体。
DoubleReceive
插件使用了一个实验性的 API,预计在即将到来的更新中会有所演进,并可能包含破坏性变更。
添加依赖项
要使用 `DoubleReceive
`,你需要在构建脚本中包含 `ktor-server-double-receive
` 构件:
安装 DoubleReceive
要将 `DoubleReceive
` 插件安装到应用程序,请在指定的
install
` 函数。以下代码片段展示了如何安装 `DoubleReceive
` ... - ... 在 `
embeddedServer
` 函数调用内部。 - ... 在显式定义的 `
module
` 内部,这是一个 `Application
` 类的扩展函数。
`DoubleReceive
` 插件也可以安装到特定路由。如果你需要针对不同的应用程序资源使用不同的 `DoubleReceive
` 配置,这可能会很有用。
安装 DoubleReceive
后,你可以多次接收请求体,并且每次调用都会返回相同的实例。例如,你可以使用 CallLogging 插件启用请求体日志记录...
install(CallLogging) {
level = Level.TRACE
format { call ->
runBlocking {
"Body: ${call.receiveText()}"
}
}
}
... 然后在路由处理函数内部再次获取请求体。
post("/") {
val receivedText = call.receiveText()
call.respondText("Text '$receivedText' is received")
}
你可以在此处找到完整示例:double-receive。
配置 DoubleReceive
在默认配置下,DoubleReceive
提供了以以下类型接收请求体的能力:
ByteArray
String
Parameters
ContentNegotiation
插件使用的数据类
默认情况下,DoubleReceive
不支持:
- 从同一个请求中接收不同类型;
- 接收流或通道。
如果你无需从同一个请求中接收不同类型,或无需接收流或通道,请将 cacheRawRequest
属性设置为 false
:
install(DoubleReceive) {
cacheRawRequest = false
}