SSE(Server-Sent Events)协议有以下一些主要要求:
-
服务器响应头设置:
Content-Type
必须设置为text/event-stream
,以表明这是一个 SSE 流。Cache-Control
通常设置为no-cache
,防止浏览器缓存响应。Connection
通常设置为keep-alive
,以保持连接的持久性。
-
数据格式:
- 以文本形式发送,每行代表一个字段或消息的一部分。
- 常见的字段有
data
用于实际的数据内容,以data:
开头,后面跟着数据,多行data
会被视为同一消息的不同部分。 - 可以使用
event
字段来指定事件类型。 - 消息以空行
\n\n
分隔。
-
重连机制:
- 客户端应该能够在连接意外中断时自动尝试重新连接。
-
字符编码:
- 通常使用 UTF-8 编码。
-
消息顺序:
- 服务器发送的消息应该按照发送的顺序被客户端接收和处理。
package main
import (
"encoding/json"
"fmt"
"github.com/labstack/echo/v4"
"time"
)
type User struct {
Name string
Age int
}
func sendStructuredSSE(c echo.Context) error {
c.Response().Header().Set("Content-Type", "text/event-stream")
c.Response().Header().Set("Cache-Control", "no-cache")
c.Response().Header().Set("Connection", "keep-alive")
counter := 0
for {
user := User{
Name: fmt.Sprintf("User %d", counter),
Age: counter + 20,
}
data, _ := json.Marshal(user)
_, err := fmt.Fprintf(c.Response(), "data: %s\n\n", data)
if err!= nil {
return err
}
c.Response().Flush()
counter++
time.Sleep(2 * time.Second)
}
}
func main() {
e := echo.New()
e.GET("/sse", sendStructuredSSE)
e.Start(":8080")
}
收起