在Go-Chi路由器上实现SSE
在Go-Chi路由器上实现SSE 我正在编写一个用于测试的SSE服务器实现,希望使用这个库(https://github.com/alexandrevicenzi/go-sse)。该库使用:
http.Handle("/events/", s)
来建立事件订阅的路由,但我找不到使用go-chi建立该路由的方法,尝试了:
r.Get("/events", s)
但这个方法不起作用
1 回复
在Go-Chi路由器中集成go-sse库时,需要将SSE处理器包装成http.Handler类型。go-sse库的sse.Server类型实现了http.Handler接口,但Chi路由器的r.Get()方法需要http.Handler类型的参数。
以下是正确的实现方式:
package main
import (
"net/http"
"github.com/alexandrevicenzi/go-sse"
"github.com/go-chi/chi"
)
func main() {
r := chi.NewRouter()
s := sse.NewServer(nil)
// 正确的方式:直接将s作为http.Handler使用
r.Get("/events", s.ServeHTTP)
// 或者使用Handle方法
r.Handle("/events", s)
http.ListenAndServe(":8080", r)
}
关键点说明:
sse.Server实现了http.Handler接口,所以可以直接作为处理器使用- 使用
r.Get("/events", s.ServeHTTP)或r.Handle("/events", s)都可以 - 确保路径匹配,go-sse库通常使用
/events/路径,注意斜杠的匹配
完整示例:
package main
import (
"net/http"
"time"
"github.com/alexandrevicenzi/go-sse"
"github.com/go-chi/chi"
)
func main() {
r := chi.NewRouter()
s := sse.NewServer(nil)
defer s.Shutdown()
// 设置SSE路由
r.Get("/events", s.ServeHTTP)
// 发送测试事件
go func() {
for {
s.SendMessage("/events", sse.SimpleMessage("hello"))
time.Sleep(2 * time.Second)
}
}()
http.ListenAndServe(":8080", r)
}
这样配置后,客户端就可以通过/events端点连接到SSE服务器了。

