Gorilla Mux удалить или заменить существующие маршруты - PullRequest
0 голосов
/ 17 февраля 2020

Я учусь Go и наткнулся на роутер гориллы / мультиплексора. Я хотел иметь динамические c маршруты в текстовом файле, таком как:

/user/1

/post/1

Я написал для этой цели следующий код:

func (s *Server) RegRoutes(routes []Route) {
    for _, r := range routes {
        func(route Route) {
            s.Router.HandleFunc(route.Path, func(w http.ResponseWriter, r *http.Request) {    
                w.Header().Add("Content-Type", "application/json")
                s.sendJson(w, route) // send response to client
            }).Methods(route.Method)
        }(r)
    }
}

и все работает нормально. Но я хочу отредактировать текстовый файл и добавить еще несколько полей или редактировать существующие без перестройки проекта или перезапуска сервера. Я нашел это , но я не мог понять, что это такое, и я не знаю, как его использовать.

Есть ли способ изменить существующие маршруты или добавить дополнительные маршруты во время пробега -время?

Редактировать:

Я добавил это:

s.Router.HandleFunc("/reload", func(w http.ResponseWriter, r *http.Request) {

        s.mu.Lock()
        s.Router = mux.NewRouter()
        s.mu.Unlock()

        // load text file and register new routes here
        ....


        s.Router.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
            tpl, err1 := route.GetPathTemplate()
            met, err2 := route.GetMethods()
            fmt.Println(tpl, err1, met, err2)
            return nil
        })
        fmt.Fprintf(w, "RELOAD")
    })

Когда я печатаю маршруты после регистрации новых маршрутов и замены Router, они регистрируются, но когда я просмотрите маршрут в браузере, это выдает ошибку 404.

1 Ответ

0 голосов
/ 17 февраля 2020

Если я понимаю, чего вы пытаетесь достичь, это будет выглядеть примерно так:

package main

import (
    "fmt"
    "github.com/gorilla/mux"
    "net/http"
)

var router = mux.NewRouter()
func handler(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("bla"))
}

func reloadHandler(w http.ResponseWriter, r *http.Request) {
    router.Walk(func(route *mux.Route, router *mux.Router, ancestors []*mux.Route) error {
        t, err := route.GetPathTemplate()
        if err != nil {
            return err
        }
        fmt.Println(t)
        if t == "/" {
            route.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
                writer.Write([]byte("akjbsdkabdjkbaksdj"))
            })
        }
        return nil
    })
}

func main() {

    router.HandleFunc("/", handler)
    router.HandleFunc("/reload", reloadHandler)

    http.ListenAndServe("localhost:8080", router)
}

Объявление маршрутизатора выходит за пределы main function, и обработчик перезагрузки может получить к нему доступ, чтобы добавить другой маршрут .

и путь, по которому вы можете проверить, хотите ли вы изменить путь, а затем измените его.

...