Skip to content
Server Plugin

数据转换

代码示例 data-conversion

所需依赖项io.ktor:ktor-server-data-conversion

Native 服务器
Ktor 支持 Kotlin/Native,允许您在没有额外运行时或虚拟机的情况下运行服务器。
支持:✅

DataConversion 插件允许您序列化和反序列化值列表。默认情况下,Ktor 通过 DefaultConversionService 处理基本类型和枚举。您可以通过安装和配置 DataConversion 插件来扩展此服务以处理其他类型。

添加依赖项

要使用 DataConversion,您需要在构建脚本中包含 ktor-server-data-conversion 构件:

Kotlin
Groovy
XML

安装 DataConversion

要在应用程序中安装 DataConversion 插件,请将其传递给指定

模块
模块允许您通过对路由进行分组来构建应用程序。
中的 install 函数。 以下代码片段展示了如何安装 DataConversion ...

  • ... 在 embeddedServer 函数调用中。
  • ... 在显式定义的 module(它是 Application 类的扩展函数)中。
kotlin
kotlin

添加转换器

您可以在 DataConversion 配置中定义类型转换。为指定类型提供 convert<T> 方法,并使用可用函数来序列化和反序列化值列表:

  • 使用 decode() 函数来反序列化值列表。它接受一个字符串列表(代表 URL 中的重复值),并返回解码后的值。

    kotlin
    decode { values -> // 转换器: (values: List<String>) -> Any?
      // 反序列化值
    }
  • 使用 encode() 函数来序列化一个值。该函数接受一个任意值并返回一个代表该值的字符串列表。

    kotlin
       encode { value -> // 转换器: (value: Any?) -> List<String>
         // 序列化值
        }

访问服务

您可以从当前上下文中访问 DataConversion 服务:

kotlin
val dataConversion = application.conversionService

然后,您可以使用转换器服务来调用回调函数:

  • fromValues(values: List<String>, type: TypeInfo) 回调函数接受 values 字符串列表,以及要转换到的 TypeInfo 目标类型,并返回解码后的值。
  • toValues(value: Any?) 回调函数接受一个任意值,并返回代表该值的字符串列表。

示例

在以下示例中,定义并配置了 LocalDate 类型的转换器,用于序列化和反序列化值。当调用 encode 函数时,该服务将使用 SimpleDateFormat 转换该值,并返回包含格式化值的列表。当调用 decode 函数时,该服务将日期格式化为 LocalDate 并将其返回。

kotlin
    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))
            }
        }
    }

随后可以手动调用转换服务来获取编码和解码后的值:

kotlin
val encodedDate = application.conversionService.toValues(call.parameters["date"])
val decodedDate = application.conversionService.fromValues(encodedDate, typeInfo<LocalDate>())

有关完整示例,请参阅 data-conversion