如何在同一个应用程序中使用 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 功能。
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 功能。