服务器发送事件 (SSE)#
SSE#
sse 包提供了一个助手,用于流式传输 Server-Sent Events (SSE) 响应。
SSE 是一种简单的协议,用于通过 HTTP 从服务器向客户端发送事件。它是一种单向协议,这意味着客户端无法向服务器发送事件,但可以消费它们被发送时的事件。它通常用作 Web 和其他客户端的推送机制。
示例#
sse 包提供了一个简单的 API,用于向客户端发送事件,并在 OpenAPI 规范中记录事件类型和数据结构,如果您提供了消息类型名称到 Go 结构体的映射:
code.go
// 使用 sse.Register 而非 huma.Register 进行注册
sse.Register(api, huma.Operation{
OperationID: "sse",
Method: http.MethodGet,
Path: "/sse",
Summary: "服务器发送事件示例",
}, map[string]any{
// 事件类型名称到 Go 结构体的映射。
"message": DefaultMessage{},
"userCreate": UserCreatedEvent{},
"mailReceived": MailReceivedEvent{},
}, func(ctx context.Context, input *struct{}, send sse.Sender) {
// 每秒发送一个事件,持续 10 秒。
for x := 0; x < 10; x++ {
send.Data(MailReceivedEvent{UserID: "abc123"})
time.Sleep(1 * time.Second)
}
})
类型重用
每个事件模型 必须 是唯一的 Go 类型。如果您想重用 Go 类型定义,可以定义一个引用另一个类型的新类型,例如 type MySpecificEvent MyBaseEvent,它将按预期工作。
发送数据#
传递给您的 SSE 操作处理程序的 send Sender 提供了几种向客户端发送数据的方法:
| 方法 | 描述 |
|---|---|
send(Message) |
使用完整的消息结构体发送事件 |
send.Data(any) |
发送包含给定数据消息 |
除非您需要设置消息 ID 或重试信息,否则首选 send.Data(any) 方法。
深入了解#
- 参考
- 外部链接