DoubleReceive
必要な依存関係: io.ktor:ktor-server-double-receive
コード例: double-receive
DoubleReceive プラグインは、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 はリクエストボディを以下の型として受信する機能を提供します:
ByteArrayStringParametersContentNegotiationプラグインで使用される データクラス
デフォルトでは、DoubleReceive は以下をサポートしていません:
- 同じリクエストから異なる型を受信する
- ストリームまたはチャネルを受信する
同じリクエストから異なる型を受信したり、ストリームやチャネルを受信したりする必要がない場合は、cacheRawRequest プロパティを false に設定してください:
install(DoubleReceive) {
cacheRawRequest = false
}