如何使用 go-swagger 提供 websocket 服务?

我正在尝试在我的 go-swagger API 中提供聊天 Websocket。我正在使用这个例子:https ://github.com/gorilla/websocket/tree/master/examples/chat


我尝试在服务器启动时将其附加到 http,但进一步阅读后我发现这是行不通的:


func configureServer(s *http.Server, scheme, addr string) {

  hub := chat.NewHub()


  go hub.Run()

  http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {

    chat.ServeWs(hub, w, r)

  })

}

然后我尝试使用自定义服务器并将 server.Serve() 更改为:


hub := chat.NewHub()

go hub.Run()


http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {

  chat.ServeWs(hub, w, r)

})


if err := http.ListenAndServe(":8080", api.Serve(nil)); err != nil {

  log.Fatalln(err)

}

但也意识到为什么这行不通。


WebSocket 握手期间出错:意外的响应代码:404


经过一番阅读后,我开始理解为什么从未找到 /ws:


hub := chat.NewHub()

go hub.Run()


mux := http.NewServeMux()

mux.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {

  chat.ServeWs(hub, w, r)

})


server.SetHandler(mux)

if err := server.Serve(); err != nil {

  log.Fatalln(err)

}

现在 websockets 可以工作,但其余 api 不能工作,我可以理解为什么,但我不知道如何让它们都工作。我对 golang 相当陌生,所以我正在努力解决这个问题。


我怎么能这么做呢?


守着一只汪
浏览 215回答 1
1回答

泛舟湖上清波郎朗

你可以把它放在一个中间件中并在configure_XXX中挂接它func mountWebSockets(next http.Handler) http.HandlerFunc {   return func(w http.ResponseWriter, r *http.Request) {       if r.URL.Path == "/ws" {            chat.ServeWs(hub, w, r)           return       }       next.ServeHTTP(w, r)   }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go