Skip to content
Server Plugin

DoubleReceive

必要な依存関係: io.ktor:ktor-server-double-receive

コード例: double-receive

ネイティブサーバー
KtorはKotlin/Nativeをサポートしており、追加のランタイムや仮想マシンなしでサーバーを実行できます。
サポート: ✅

[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アーティファクトをビルドスクリプトに含める必要があります。

Kotlin
Groovy
XML

DoubleReceiveをインストールする

アプリケーションにDoubleReceiveプラグインをインストールするには、指定された

モジュール
モジュールを使用すると、ルートをグループ化してアプリケーションを構造化できます。
内のinstall関数に渡します。 以下のコードスニペットは、DoubleReceiveをインストールする方法を示しています...

  • ... embeddedServer関数呼び出し内で。
  • ... Applicationクラスの拡張関数である明示的に定義されたmodule内で。
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
}