Ktor ClientにおけるWebSocketsシリアライゼーション
ContentNegotiationプラグインと同様に、WebSocketsはテキストフレームを特定の形式でシリアライズ/デシリアライズできます。Ktorクライアントは、以下の形式を標準でサポートしています: JSON、XML、CBOR、およびProtoBuf。
依存関係を追加する
kotlinx.serializationコンバーターを使用する前に、Setupセクションで説明されているように、Kotlinシリアライゼーションプラグインを追加する必要があります。
JSON
JSONデータをシリアライズ/デシリアライズするには、以下のいずれかのライブラリを選択できます: kotlinx.serialization、Gson、またはJackson。
ビルドスクリプトにktor-serialization-kotlinx-json
アーティファクトを追加します:
ビルドスクリプトにktor-serialization-gson
アーティファクトを追加します:
ビルドスクリプトにktor-serialization-jackson
アーティファクトを追加します:
XML
XMLをシリアライズ/デシリアライズするには、ビルドスクリプトにktor-serialization-kotlinx-xml
を追加します:
注意: XMLシリアライゼーションは
jsNode
ターゲットではサポートされていません。
CBOR
CBORをシリアライズ/デシリアライズするには、ビルドスクリプトにktor-serialization-kotlinx-cbor
を追加します:
ProtoBuf
ProtoBufをシリアライズ/デシリアライズするには、ビルドスクリプトにktor-serialization-kotlinx-protobuf
を追加します:
シリアライザーを構成する
JSONシリアライザー
WebSocketsの設定でJSONシリアライザーを登録するには、Json
パラメータを指定してKotlinxWebsocketSerializationConverter
インスタンスを作成し、このインスタンスをcontentConverter
プロパティに割り当てます:
import io.ktor.serialization.kotlinx.*
import kotlinx.serialization.json.*
val client = HttpClient(CIO) {
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(Json)
}
}
Gsonシリアライザーを登録するには、GsonWebsocketContentConverter
をcontentConverter
プロパティに割り当てます:
import io.ktor.serialization.gson.*
install(WebSockets) {
contentConverter = GsonWebsocketContentConverter()
}
Jacksonシリアライザーを登録するには、JacksonWebsocketContentConverter
をcontentConverter
プロパティに割り当てます:
import io.ktor.serialization.jackson.*
install(WebSockets) {
contentConverter = JacksonWebsocketContentConverter()
}
XMLシリアライザー
WebSocketsの設定でXMLシリアライザーを登録するには、XML
パラメータを指定してKotlinxWebsocketSerializationConverter
インスタンスを作成し、このインスタンスをcontentConverter
プロパティに割り当てます:
import nl.adaptivity.xmlutil.serialization.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(XML)
}
CBORシリアライザー
WebSocketsの設定でCBORシリアライザーを登録するには、Cbor
パラメータを指定してKotlinxWebsocketSerializationConverter
インスタンスを作成し、このインスタンスをcontentConverter
プロパティに割り当てます:
import io.ktor.serialization.kotlinx.cbor.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(Cbor)
}
ProtoBufシリアライザー
WebSocketsの設定でProtoBufシリアライザーを登録するには、ProtoBuf
パラメータを指定してKotlinxWebsocketSerializationConverter
インスタンスを作成し、このインスタンスをcontentConverter
プロパティに割り当てます:
import io.ktor.serialization.kotlinx.protobuf.*
install(WebSockets) {
contentConverter = KotlinxWebsocketSerializationConverter(ProtoBuf)
}
データの送受信
データクラスを作成する
テキストフレームをオブジェクトにシリアライズ/デシリアライズするには、データクラスを作成する必要があります。例:
data class Customer(val id: Int, val firstName: String, val lastName: String)
kotlinx.serializationを使用する場合、このクラスに@Serializable
アノテーションが付いていることを確認してください:
@Serializable
data class Customer(val id: Int, val firstName: String, val lastName: String)
kotlinx.serialization
の詳細については、Kotlin Serialization Guideを参照してください。
データを送信する
指定された形式でテキストフレーム内にクラスインスタンスを送信するには、sendSerialized
関数を使用します:
client.webSocket(method = HttpMethod.Get, host = "127.0.0.1", port = 8080, path = "/customer") {
sendSerialized(Customer(1, "Jane", "Smith"))
}
データを受信する
テキストフレームのコンテンツを受信して変換するには、データクラスをパラメータとして受け取るreceiveDeserialized
関数を呼び出します:
client.webSocket(method = HttpMethod.Get, host = "127.0.0.1", port = 8080, path = "/customer/1") {
val customer = receiveDeserialized<Customer>()
println("A customer with id ${customer.id} is received by the client.")
}
incomingチャネルからデシリアライズされたフレームを受信するには、WebsocketContentConverter.deserialize関数を使用します。WebsocketContentConverter
はDefaultClientWebSocketSession.converter
プロパティを介して利用可能です。
完全な例はこちらで見つけることができます: client-websockets-serialization。