数据转换
代码示例: 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 -> // 转换器: (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
