#kotlin #ktor #ktor-client
Вопрос:
сегодня я был на пути к созданию приложения в режиме реального времени и хотел использовать веб-сайты для обновления своих состояний.
Все работало хорошо, пока я не получил это Исключение:
kotlinx.serialization.SerializationException: Serializer for class 'DefaultClientWebSocketSession' is not found.
Mark the class as @Serializable or provide the serializer explicitly.
Я искал и искал, но ничего не нашел.
Так что мой код выглядит аналогично этому:
Импорт Gradle:
implementation("io.ktor:ktor-client-core:1.6.2")
implementation("io.ktor:ktor-client-cio:1.6.2")
implementation("io.ktor:ktor-client-serialization:1.6.2")
implementation("io.ktor:ktor-client-websockets:1.6.2")
Код:
suspend fun main() {
val endpoint = Url("http://localhost:8080")
val client = HttpClient(CIO) {
install(JsonFeature) {
serializer = KotlinxSerializer()
}
install(WebSockets)
}
client.webSocket({
url {
takeFrom(endpoint)
path("beeam")
}
}) {
//Do something
}
}
Я надеюсь, что там есть кто-то, кто может мне помочь.
Комментарии:
1. Не могли бы вы, пожалуйста, попытаться заменить
http
протоколws
на URL конечной точки? Кроме того, пожалуйста, поделитесь настройками сервера.2. Спасибо, что помогли! Проблема заключалась в схеме. Но текст экзекуции на самом деле не имел никакого отношения к схеме.
Ответ №1:
Проблема
Проблема в том, что endpoint.protocol
есть URLProtocol.HTTP
и нет URLProtocol.WS
, и с takeFrom
вами тоже передают эту собственность.
Решение
suspend fun main() {
val endpoint = Url("http://localhost:8080")
val client = HttpClient(CIO) {
install(JsonFeature) {
serializer = KotlinxSerializer()
}
install(WebSockets)
}
client.webSocket({
url {
takeFrom(endpoint)
path("beeam")
protocol = URLProtocol.WS
}
}) {
//Do something
}
}