Skip to content
Server Plugin

データ変換

コード例: data-conversion

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

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

DataConversionプラグインを使用すると、値のリストをシリアライズおよびデシリアライズできます。デフォルトでは、KtorはDefaultConversionServiceを介してプリミティブ型と列挙型を処理します。このサービスを拡張して追加の型を処理するには、DataConversionプラグインをインストールして設定します。

依存関係を追加する

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

Kotlin
Groovy
XML

DataConversionをインストールする

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

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

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

コンバーターを追加する

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

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

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

    kotlin
       encode { value -> // converter: (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 -> // converter: (values: List<String>) -> Any?
                LocalDate.from(formatter.parse(values.single()))
            }

            encode { value -> // converter: (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を参照してください。