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