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 -> // converter: (values: List<String>) -> Any?
      // 反序列化值
    }
  • 使用 encode() 函式來序列化一個值。該函式接收一個任意的值,並回傳代表它的字串清單。

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