我正在我当前的android项目中研究ktor客户端,用于消费WebSocket流。
我的ktor客户端配置如下:
val client = HttpClient(OkHttp) {
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.ALL
}
install(ContentNegotiation) {
json(Json {
ignoreUnknownKeys = false
isLenient = true
encodeDefaults = true
coerceInputValues = true
explicitNulls = false
})
}
install(WebSockets) {
pingInterval = 20_000
}
}
字符串
我的WebSocket会话配置如下:-
client.webSocket(urlString = "wss://stream.org") {
incoming.consumeEach { frame ->
when (frame) {
is Frame.Binary -> println("Frame.Binary = $frame")
is Frame.Text -> {
println("Frame.Text = $frame")
val incoming = frame.readText()
println("\tincoming $incoming")
val eventResponse = json.decodeFromString<WebSocketResponse>(incoming)
when (eventResponse.event) {
Event.CONNECTED -> println("Event.SUBSCRIPTION_CREATED = $incoming")
Event.SUBSCRIPTION_CREATED -> println("Event.SUBSCRIPTION_CREATED = $incoming")
Event.SUBSCRIPTION_DELETED -> println("Event.SUBSCRIPTION_DELETED = $incoming")
Event.TOPIC_ADDED -> println("Event.TOPIC_ADDED = $incoming")
Event.TOPIC_REMOVED -> println("Event.TOPIC_REMOVED = $incoming")
Event.TOPIC_UPDATED -> println("Event.TOPIC_UPDATED = $incoming")
else -> TODO("Unexpected event $eventResponse")
}
}
is Frame.Close -> println("Frame.Close = $frame")
is Frame.Ping -> println("Frame.Ping = $frame")
is Frame.Pong -> println("Frame.Pong = $frame")
else -> TODO("Unexpected frame = $frame")
}
}
}
型val eventResponse = json.decodeFromString<WebSocketResponse>(incoming)
中的json
是一个与ktor客户端中配置的json示例不同的json示例,因为我已经声明它用于通过改造处理restful API调用
其声明如下:
@OptIn(ExperimentalSerializationApi::class)
val json = Json {
ignoreUnknownKeys = true
isLenient = true
encodeDefaults = true
coerceInputValues = false
explicitNulls = false
}
型
如何使用我为内容协商配置的json示例?
1条答案
按热度按时间0qx6xfy61#
您不能从
ContentNegotiation
插件访问Json
示例,但您可以使用预定义的Json
对象配置插件,并将其用于WebSockets数据包封装。字符串