如何在同一个应用程序中使用 gorilla websocket 和 mux?

How to use gorilla websocket and mux in the same application?

func main() {
    router := mux.NewRouter().StrictSlash(true)
    router.HandleFunc("/api", home)
    fs := http.FileServer(http.Dir("../public"))
    http.Handle("/", fs)
    http.HandleFunc("/ws", handleConnections)
    go handleMessages()

    log.Println("http server started on :8000")
    err := http.ListenAndServe(":8000", nill)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

使用上面的代码,/api 路由给出了 404。 但是,如果我将 err := http.ListenAndServe(":8000", nill) 更改为 err := http.ListenAndServe(":8000", router),/api 路由有效,但 / 路由(我为前端服务)给出 404.

如何让它们同时工作?

编辑:完整代码 - https://codeshare.io/2Kpyb8

http.ListenAndServe函数的第二个参数类型是http.Handler,如果他是nil,http lib使用http.DefaultServeMux http.Handler.

你的/api路由注册到mux.NewRouter(),你的//ws路由注册到http.DefaultServeMux,这是两个不同的http.Handler objetc,需要合并两个router注册的路由请求。

    router := mux.NewRouter().StrictSlash(true)
    router.HandleFunc("/api", home)
    // move ws up, prevent '/*' from covering '/ws' in not testing mux, httprouter has this bug.
    router.HandleFunc("/ws", handleConnections)
    // PathPrefix("/") match '/*' request
    router.PathPrefix("/").Handler(http.FileServer(http.Dir("../public")))
    go handleMessages()
    http.ListenAndServe(":8000", router)

gorilla/mux example 未使用 http.HandleFunc 功能。