Skip to content
Server Plugin

数据转换

代码示例: data-conversion

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

原生服务器
Ktor 支持 Kotlin/Native,并允许您无需额外的运行时或虚拟机即可运行服务器。
支持: ✅

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

添加依赖项

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

Kotlin
Groovy
XML

安装 DataConversion

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

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

  • ... 在 embeddedServer 函数调用内部。
  • ... 在显式定义的 module 内部,它是 Application 类的扩展函数。
kotlin
kotlin

添加转换器

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

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

    kotlin
    decode { values -> // converter: (values: List<String>) -> Any?
      //deserialize values
    }
  • 使用 encode() 函数序列化值。该函数接受任意值,并返回表示它的 字符串列表。

    kotlin
       encode { value -> // converter: (value: Any?) -> List<String>
         //serialize value
        }

访问服务

您可以从当前上下文访问 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 -> // converter: (values: List<String>) -> Any?
                LocalDate.from(formatter.parse(values.single()))
            }

            encode { value -> // converter: (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