資料轉換
程式碼範例: data-conversion
必要的相依性:io.ktor:ktor-server-data-conversion
DataConversion 外掛程式可讓您序列化與反序列化值的清單。預設情況下,Ktor 透過 DefaultConversionService 處理基本型別與列舉。您可以透過安裝與配置 DataConversion 外掛程式來擴充此服務,以處理額外的型別。
新增相依性
若要使用 DataConversion,您需要在組建指令碼中包含 ktor-server-data-conversion 構件:
安裝 DataConversion
若要將 DataConversion 外掛程式安裝到應用程式,請將其傳遞給指定
install 函式。 下方的程式碼片段展示了如何安裝 DataConversion ... - ... 在
embeddedServer函式呼叫內。 - ... 在明確定義的
module內,該模組是Application類別的擴充函式。
新增轉換器
您可以在 DataConversion 配置中定義型別轉換。為指定的型別提供 convert<T> 方法,並使用可用的函式來序列化與反序列化值的清單:
使用
decode()函式來反序列化值的清單。它接收一個字串清單(代表 URL 中重複的值),並回傳解碼後的值。kotlindecode { values -> // converter: (values: List<String>) -> Any? // 反序列化值 }使用
encode()函式來序列化一個值。該函式接收一個任意的值,並回傳代表它的字串清單。kotlinencode { value -> // converter: (value: Any?) -> List<String> // 序列化值 }
存取服務
您可以從當前上下文中存取 DataConversion 服務:
val dataConversion = application.conversionService接著,您可以使用轉換器服務來呼叫回呼函式:
fromValues(values: List<String>, type: TypeInfo)回呼函式接受values作為字串清單,以及要將值轉換成的TypeInfo,並回傳解碼後的值。toValues(value: Any?)回呼函式接受一個任意的值,並回傳代表它的字串清單。
範例
在以下範例中,定義了 LocalDate 型別的轉換器,並配置為序列化與反序列化值。當呼叫 encode 函式時,服務將使用 SimpleDateFormat 轉換該值,並回傳包含格式化後值的清單。當呼叫 decode 函式時,服務將日期格式化為 LocalDate 並將其回傳。
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))
}
}
}接著可以手動呼叫轉換服務來取得編碼與解碼後的值:
val encodedDate = application.conversionService.toValues(call.parameters["date"])
val decodedDate = application.conversionService.fromValues(encodedDate, typeInfo<LocalDate>())如需完整範例,請參閱 data-conversion
