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