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