データ変換
コード例: data-conversion
必要な依存関係: io.ktor:ktor-server-data-conversion
DataConversion
プラグインを使用すると、値のリストをシリアライズおよびデシリアライズできます。デフォルトでは、KtorはDefaultConversionService
を介してプリミティブ型と列挙型を処理します。このサービスを拡張して追加の型を処理するには、DataConversion
プラグインをインストールして設定します。
依存関係を追加する
DataConversion
を使用するには、ktor-server-data-conversion
アーティファクトをビルドスクリプトに含める必要があります。
DataConversionをインストールする
DataConversion
プラグインをアプリケーションにインストールするには、指定された
install
関数に渡します。 以下のコードスニペットは、DataConversion
をインストールする方法を示しています... - ...
embeddedServer
関数呼び出し内で。 - ...明示的に定義された
module
内。これはApplication
クラスの拡張関数です。
コンバーターを追加する
DataConversion
の設定内で型変換を定義できます。指定された型に対してconvert<T>
メソッドを提供し、利用可能な関数を使用して値のリストをシリアライズおよびデシリアライズします。
decode()
関数を使用して値のリストをデシリアライズします。これは、URL内の繰り返し値を表す文字列のリストを受け取り、デコードされた値を返します。kotlindecode { values -> // converter: (values: List<String>) -> Any? //値をデシリアライズする }
encode()
関数を使用して値をシリアライズします。この関数は任意の値をとり、それを表す文字列のリストを返します。kotlinencode { value -> // converter: (value: Any?) -> List<String> //値をシリアライズする }
サービスにアクセスする
現在のコンテキストからDataConversion
サービスにアクセスできます。
val dataConversion = application.conversionService
その後、コンバーターサービスを使用してコールバック関数を呼び出すことができます。
fromValues(values: List<String>, type: TypeInfo)
コールバック関数は、values
を文字列のリストとして、および値を変換するためのTypeInfo
を受け入れ、デコードされた値を返します。toValues(value: Any?)
コールバック関数は、任意の値をとり、それを表す文字列のリストを返します。
例
以下の例では、LocalDate
型のコンバーターが定義され、値のシリアライズおよびデシリアライズ用に設定されています。encode
関数が呼び出されると、サービスはSimpleDateFormat
を使用して値を変換し、フォーマットされた値を含むリストを返します。decode
関数が呼び出されると、サービスは日付をLocalDate
としてフォーマットし、それを返します。
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))
}
}
}
変換サービスは、エンコードおよびデコードされた値を取得するために手動で呼び出すことができます。
val encodedDate = application.conversionService.toValues(call.parameters["date"])
val decodedDate = application.conversionService.fromValues(encodedDate, typeInfo<LocalDate>())
完全な例については、data-conversion
を参照してください。