データ変換
コード例: 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を参照してください。
