データ変換
コード例: data-conversion
必要な依存関係: io.ktor:ktor-server-data-conversion
DataConversion プラグインを使用すると、値のリストをシリアライズ(serialize)およびデシリアライズ(deserialize)できます。デフォルトでは、Ktorは DefaultConversionService を通じてプリミティブ型と列挙型(enum)を処理します。DataConversion プラグインをインストールして構成することで、このサービスを拡張して追加の型を処理できるようになります。
依存関係の追加
DataConversion を使用するには、ビルドスクリプトに ktor-server-data-conversion アーティファクトを含める必要があります。
DataConversion のインストール
アプリケーションに DataConversion プラグインをインストールするには、指定された
install 関数に渡します。 以下のコードスニペットは、DataConversion をインストールする方法を示しています。 - ...
embeddedServer関数の呼び出し内。 - ...
Applicationクラスの拡張関数である、明示的に定義されたmodule内。
コンバーターの追加
DataConversion の構成内で型変換を定義できます。指定した型に対して convert<T> メソッドを提供し、利用可能な関数を使用して値のリストをシリアライズおよびデシリアライズします。
値のリストをデシリアライズするには、
decode()関数を使用します。これは、URL内の繰り返される値を表す文字列のリストを受け取り、デコードされた値を返します。kotlindecode { values -> // コンバーター: (values: List<String>) -> Any? // 値をデシリアライズする }値をシリアライズするには、
encode()関数を使用します。この関数は任意の値を受け取り、それを表す文字列のリストを返します。kotlinencode { value -> // コンバーター: (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 -> // コンバーター: (values: List<String>) -> Any?
LocalDate.from(formatter.parse(values.single()))
}
encode { value -> // コンバーター: (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 を参照してください。
