Server-Sent Events
Ktor Client 中的 Server-Sent Events
代码示例: client-sse
Server-Sent Events (SSE) 是一项允许服务器通过 HTTP 连接持续向客户端推送事件的技术。它在服务器需要发送基于事件的更新而无需客户端反复轮询服务器的情况下特别有用。
Ktor 支持的 SSE 插件提供了一种在服务器和客户端之间创建单向连接的简便方法。
配置 SSE 插件
您可以选择在 install 块中通过设置 SSEConfig 类支持的属性来配置 SSE 插件。
SSE 重连
要启用自动重连,请将 maxReconnectionAttempts 设置为大于 0 的值。您还可以使用 reconnectionTime 配置尝试之间的延迟:
如果与服务器的连接丢失,客户端将在尝试重连之前等待指定的 reconnectionTime。它将尝试最多 maxReconnectionAttempts 次来重新建立连接。
响应缓冲
SSE 响应本质上是流式的,这使得捕获完整正文变得不切实际。您可以启用诊断缓冲区,以便在 SSE 流失败时安全地检索响应正文。缓冲区仅包含已处理的数据(不会从网络重新读取),旨在用于失败情况下的日志记录和错误分析。
您还可以按调用配置缓冲区:
缓冲策略
SSEBufferPolicy 类型提供了几种存储已处理 SSE 数据的策略。这些策略控制内存中保留多少流数据,并在发生错误时使其可用。
NOTE
对于长期存续的流,请谨慎使用。 失败时,您可以使用 response?.bodyAsText() 访问缓冲区,而无需从网络重新读取。
处理 SSE 会话
客户端的 SSE 会话由 ClientSSESession 接口表示。该接口公开了允许您接收来自服务器的服务器发送事件的 API。
访问 SSE 会话
HttpClient 允许您通过以下方式之一访问 SSE 会话:
sse()函数创建 SSE 会话并允许您对其执行操作。sseSession()函数允许您打开一个 SSE 会话。
要指定 URL 端点,您可以从两个选项中进行选择:
- 使用
urlString形参将整个 URL 指定为字符串。 - 分别使用
schema、host、port和path形参来指定协议方案、域名、端口号和路径名。
NOTE
ClientSSESession 和 ClientSSESessionWithDeserialization 实例仅在会话期间有效。当 serverSentEvents { ... } 块完成或连接关闭时,它们的作用域会自动取消。 此外,还有以下形参可用于配置连接:
retry 字段的事件。 TypedServerSentEvent 的 data 字段转换为对象。更多信息请参阅 反序列化。 SSE 会话块
在 lambda 实参中,您可以访问 ClientSSESession 上下文。该块中提供以下属性:
HttpClientCall。 下面的示例创建了一个具有 events 端点的新 SSE 会话,通过 incoming 属性读取事件并打印接收到的 ServerSentEvent。
有关完整示例,请参阅 client-sse。
反序列化
SSE 插件支持将服务器发送事件反序列化为类型安全的 Kotlin 对象。当处理来自服务器的结构化数据时,此功能特别有用。
要启用反序列化,请在 SSE 访问函数上使用 deserialize 形参提供自定义反序列化函数,并使用 ClientSSESessionWithDeserialization 类来处理反序列化后的事件。
以下是使用 kotlinx.serialization 反序列化 JSON 数据的示例:
有关完整示例,请参阅 client-sse。
