如何在Go中使用mux(gorilla)进行路由组合?

huangapple go评论121阅读模式
英文:

How to combine mux (gorilla) in Go?

问题

我有以下代码,其中包含两个 mux,一个用于未经身份验证的路由(r),另一个用于经过身份验证的路由(chain)。我想将这两个合并并提供服务。

  1. package main
  2. import (
  3. "ekart.com/authentication_service/models"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "github.com/gorilla/mux"
  8. "github.com/justinas/alice"
  9. )
  10. func main() {
  11. var JSON_SECRET []byte = []byte("TZWfMhBEuyzsc2e52wQQaDxfBriktka9GR4BhBtH9PhXi6XHwyaaaUyxBc-yd1RtYKsiFAGXZcBJuQ6ML5UGBEEx72Qhw6Q-192msUDwMHxT3Scz5wWnk--Bp8wotvu7FS2-v88cvC52e1lfG8mr60dGu7kg-jzcRa5cDTfR4KMQIAD6lO1H3J6f48u46gLjQtzOLPH9yjx0mqVtGWmaizGMQE7NdrhHH5ZlMuuj-A6lZRjf2VZKxUiFFWmfnVMhPVh-wpOybMaFzhUjm-RWXQ-E6cCeI-sBzcu5ZJ8aZVnYPc1Inc5RJ9R5rKQblctxHt5QCYlxiFHb63aO36ZS0Q")
  12. var DSN string = "root:toor@tcp(localhost:3306)/ekart_auth?charset=utf8&parseTime=True&loc=Local"
  13. app := Config{secret: JSON_SECRET}
  14. app.NewDatabaseConnection(DSN)
  15. app.DB.AutoMigrate(&models.User{})
  16. r := mux.NewRouter()
  17. r.HandleFunc("/login", app.Login).Methods("POST")
  18. r.HandleFunc("/register", app.Register).Methods("POST")
  19. authmux := mux.NewRouter()
  20. authmux.HandleFunc("/onlyauth", app.OnlyIfAuthenticated).Methods("GET")
  21. chain := alice.New(app.Authenticate).Then(authmux)
  22. log.Print(fmt.Sprintf("Starting Server on port %d", 8080))
  23. log.Fatal(http.ListenAndServe(fmt.Sprintf(":%v", 8080), r))
  24. }

我尝试了这种方法,但没有成功。

我还尝试了这里的方法:

  1. s := r.PathPrefix("/auth").Subrouter()
  2. s.HandleFunc("/", chain.ServeHTTP)

但这也没有成功。

如果答案不需要我创建子路径会更好,但如果必须这样做也可以。

英文:

I have the following code in which I have two mux, one for unauthenticated routes (r) and another for authenticated routes (chain). I want to combine these two and serve.

  1. package main
  2. import (
  3. "ekart.com/authentication_service/models"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "github.com/gorilla/mux"
  8. "github.com/justinas/alice"
  9. )
  10. func main() {
  11. var JSON_SECRET []byte = []byte("TZWfMhBEuyzsc2e52wQQaDxfBriktka9GR4BhBtH9PhXi6XHwyaaaUyxBc-yd1RtYKsiFAGXZcBJuQ6ML5UGBEEx72Qhw6Q-192msUDwMHxT3Scz5wWnk--Bp8wotvu7FS2-v88cvC52e1lfG8mr60dGu7kg-jzcRa5cDTfR4KMQIAD6lO1H3J6f48u46gLjQtzOLPH9yjx0mqVtGWmaizGMQE7NdrhHH5ZlMuuj-A6lZRjf2VZKxUiFFWmfnVMhPVh-wpOybMaFzhUjm-RWXQ-E6cCeI-sBzcu5ZJ8aZVnYPc1Inc5RJ9R5rKQblctxHt5QCYlxiFHb63aO36ZS0Q")
  12. var DSN string = "root:toor@tcp(localhost:3306)/ekart_auth?charset=utf8&parseTime=True&loc=Local"
  13. app := Config{secret: JSON_SECRET}
  14. app.NewDatabaseConnection(DSN)
  15. app.DB.AutoMigrate(&models.User{})
  16. r := mux.NewRouter()
  17. r.HandleFunc("/login", app.Login).Methods("POST")
  18. r.HandleFunc("/register", app.Register).Methods("POST")
  19. authmux := mux.NewRouter()
  20. authmux.HandleFunc("/onlyauth", app.OnlyIfAuthenticated).Methods("GET")
  21. chain := alice.New(app.Authenticate).Then(authmux)
  22. log.Print(fmt.Sprintf("Starting Server on port %d", 8080))
  23. log.Fatal(http.ListenAndServe(fmt.Sprintf(":%v", 8080), r))
  24. }

I have tried this way but that didn't work.

Also I tried from here

  1. s := r.PathPrefix("/auth").Subrouter()
  2. s.HandleFunc("/", chain.ServeHTTP)

But this also doesn't work.

It would be better if the answer doesn't require me to create a subpath but ok if I have to do that.

答案1

得分: 1

你可以使用mux包的Use方法将r和chain路由器结合起来。你可以使用Use方法将中间件添加到路由中,由于chain具有一个中间件app.Authenticate,你可以将其作为中间件添加到r路由器中。

  1. func main() {
  2. // ...
  3. r := mux.NewRouter()
  4. r.HandleFunc("/login", app.Login).Methods("POST")
  5. r.HandleFunc("/register", app.Register).Methods("POST")
  6. authmux := mux.NewRouter()
  7. authmux.HandleFunc("/onlyauth", app.OnlyIfAuthenticated).Methods("GET")
  8. chain := alice.New(app.Authenticate).Then(authmux)
  9. r.Use(app.Authenticate)
  10. r.PathPrefix("/auth").Handler(chain)
  11. log.Print(fmt.Sprintf("Starting Server on port %d", 8080))
  12. log.Fatal(http.ListenAndServe(fmt.Sprintf(":%v", 8080), r))
  13. }

现在,所有在/auth下的路由都将应用app.Authenticate中间件。

英文:

You can combine both r and chain routers by using the Use method of the mux package. You can use Use to add a middleware to a route, and since chain has a middleware app.Authenticate using alice.New, you can add it to the r router as a middleware.

  1. func main() {
  2. // ...
  3. r := mux.NewRouter()
  4. r.HandleFunc("/login", app.Login).Methods("POST")
  5. r.HandleFunc("/register", app.Register).Methods("POST")
  6. authmux := mux.NewRouter()
  7. authmux.HandleFunc("/onlyauth", app.OnlyIfAuthenticated).Methods("GET")
  8. chain := alice.New(app.Authenticate).Then(authmux)
  9. r.Use(app.Authenticate)
  10. r.PathPrefix("/auth").Handler(chain)
  11. log.Print(fmt.Sprintf("Starting Server on port %d", 8080))
  12. log.Fatal(http.ListenAndServe(fmt.Sprintf(":%v", 8080), r))
  13. }

Now all routes under /auth will have the app.Authenticate middleware applied to them.

huangapple
  • 本文由 发表于 2023年2月4日 23:00:29
  • 转载请务必保留本文链接:https://go.coder-hub.com/75345954.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定