DoubleReceive
必要な依存関係: io.ktor:ktor-server-double-receive
コード例: double-receive
[DoubleReceive](https://api.ktor.io/ktor-server/ktor-server-plugins/ktor-server-double-receive/io.ktor.server.plugins.doublereceive/-double-receive.html)
プラグインは、RequestAlreadyConsumedException
例外なしにリクエストボディを複数回受け取る機能を提供します。 これは、プラグインがすでにリクエストボディを消費してしまい、ルートハンドラー内でそれを受け取ることができない場合に役立ちます。 例えば、DoubleReceive
を使用して、CallLoggingプラグインでリクエストボディをログに記録し、その後post
ルートハンドラー内で再度ボディを受け取ることができます。
DoubleReceive
プラグインは実験的なAPIを使用しており、今後のアップデートで進化し、破壊的な変更が発生する可能性があります。
依存関係を追加する
DoubleReceive
を使用するには、ktor-server-double-receive
アーティファクトをビルドスクリプトに含める必要があります。
DoubleReceiveをインストールする
アプリケーションにDoubleReceive
プラグインをインストールするには、指定された
install
関数に渡します。 以下のコードスニペットは、DoubleReceive
をインストールする方法を示しています... - ...
embeddedServer
関数呼び出し内で。 - ...
Application
クラスの拡張関数である明示的に定義されたmodule
内で。
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
}