Как использовать gorilla websocket и mux в одном приложении? - PullRequest
0 голосов
/ 10 апреля 2020
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

1 Ответ

1 голос
/ 10 апреля 2020

Второй тип параметра функции http.ListenAndServe - http.Handler, если он равен nil, http lib использует http.DefaultServeMux http.Handler.

ваш /api регистр маршрутизации к mux.NewRouter(), ваш / и /ws регистр маршрутов к http.DefaultServeMux, это два разных http.Handler objet c, вам необходимо объединить запросы маршрутизации, зарегистрированные двумя маршрутизаторами.

    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)

пример гориллы / мукса не использовать функцию http.HandleFun c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...