Skip to content

服务器发送事件 (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) 方法。

深入了解#