在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)
}

关键点说明:

  1. sse.Server实现了http.Handler接口,所以可以直接作为处理器使用
  2. 使用r.Get("/events", s.ServeHTTP)r.Handle("/events", s)都可以
  3. 确保路径匹配,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服务器了。

回到顶部