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
}