数据转换
代码示例: data-conversion
所需依赖项: io.ktor:ktor-server-data-conversion
DataConversion 插件 允许您序列化和反序列化值列表。默认情况下,Ktor 通过 DefaultConversionService 处理原生类型和枚举。 您可以通过安装和配置 DataConversion 插件来扩展此服务以处理额外类型。
添加依赖项
要使用 DataConversion,您需要在构建脚本中包含 ktor-server-data-conversion artifact:
安装 DataConversion
要安装 DataConversion 插件到应用程序, 请将其传递给指定
install 函数。 下面的代码片段展示了如何安装 DataConversion ... - ... 在
embeddedServer函数调用内部。 - ... 在显式定义的
module内部,它是Application类的扩展函数。
添加转换器
您可以在 DataConversion 配置中定义类型转换。为指定类型提供一个 convert<T> 方法,并使用可用 函数来序列化和反序列化值列表:
使用
decode()函数反序列化值列表。它接受一个字符串列表,表示 URL 中重复的值,并返回解码后的值。kotlindecode { values -> // converter: (values: List<String>) -> Any? //deserialize values }使用
encode()函数序列化值。该函数接受任意值,并返回表示它的 字符串列表。kotlinencode { value -> // converter: (value: Any?) -> List<String> //serialize value }
访问服务
您可以从当前上下文访问 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
