Skip to content
Server Plugin

データ変換

コード例: data-conversion

必要な依存関係: io.ktor:ktor-server-data-conversion

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

DataConversion プラグインを使用すると、値のリストをシリアライズ(serialize)およびデシリアライズ(deserialize)できます。デフォルトでは、Ktorは DefaultConversionService を通じてプリミティブ型と列挙型(enum)を処理します。DataConversion プラグインをインストールして構成することで、このサービスを拡張して追加の型を処理できるようになります。

依存関係の追加

DataConversion を使用するには、ビルドスクリプトに ktor-server-data-conversion アーティファクトを含める必要があります。

Kotlin
Groovy
XML

DataConversion のインストール

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

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

  • ... embeddedServer 関数の呼び出し内。
  • ... Application クラスの拡張関数である、明示的に定義された module 内。
kotlin
kotlin

コンバーターの追加

DataConversion の構成内で型変換を定義できます。指定した型に対して convert<T> メソッドを提供し、利用可能な関数を使用して値のリストをシリアライズおよびデシリアライズします。

  • 値のリストをデシリアライズするには、decode() 関数を使用します。これは、URL内の繰り返される値を表す文字列のリストを受け取り、デコードされた値を返します。

    kotlin
    decode { values -> // コンバーター: (values: List<String>) -> Any?
      // 値をデシリアライズする
    }
  • 値をシリアライズするには、encode() 関数を使用します。この関数は任意の値を受け取り、それを表す文字列のリストを返します。

    kotlin
       encode { value -> // コンバーター: (value: Any?) -> List<String>
         // 値をシリアライズする
        }

サービスへのアクセス

現在のコンテキストから DataConversion サービスにアクセスできます。

kotlin
val dataConversion = application.conversionService

その後、コンバーターサービスを使用してコールバック関数を呼び出すことができます。

  • fromValues(values: List<String>, type: TypeInfo) コールバック関数は、文字列のリストとしての values と、値を変換する先の TypeInfo を受け取り、デコードされた値を返します。
  • toValues(value: Any?) コールバック関数は、任意の値を受け取り、それを表す文字列のリストを返します。

次の例では、LocalDate 型のコンバーターが定義され、値をシリアライズおよびデシリアライズするように構成されています。encode 関数が呼び出されると、サービスは SimpleDateFormat を使用して値を変換し、フォーマットされた値を含むリストを返します。 decode 関数が呼び出されると、サービスは日付を LocalDate としてフォーマットして返します。

kotlin
    install(DataConversion) {
        convert<LocalDate> { // this: DelegatingConversionService
            val formatter = DateTimeFormatterBuilder()
                .appendValue(ChronoField.YEAR, 4, 4, SignStyle.NEVER)
                .appendValue(ChronoField.MONTH_OF_YEAR, 2)
                .appendValue(ChronoField.DAY_OF_MONTH, 2)
                .toFormatter(Locale.ROOT)

            decode { values -> // コンバーター: (values: List<String>) -> Any?
                LocalDate.from(formatter.parse(values.single()))
            }

            encode { value -> // コンバーター: (value: Any?) -> List<String>
                listOf(SimpleDateFormat.getInstance().format(value))
            }
        }
    }

その後、変換サービスを手動で呼び出して、エンコードおよびデコードされた値を取得できます。

kotlin
val encodedDate = application.conversionService.toValues(call.parameters["date"])
val decodedDate = application.conversionService.fromValues(encodedDate, typeInfo<LocalDate>())

完全な例については、data-conversion を参照してください。