gorilla/mux嵌套路由不匹配
我不知道为什么我的路线不匹配gorilla/mux嵌套路由不匹配,go,routes,mux,Go,Routes,Mux,我不知道为什么我的路线不匹配localhost:8000匹配,我得到了预期的输出,但不是localhost:8000/admin/test。当我尝试在浏览器上匹配/admin/test时,我得到了404 我希望以这种方式组织代码,因为我希望在每个包中包含路由和其他子例程 项目结构 /admin admin.go main.go 梅因,加油 package main import ( "example.com/liondancer/playground/admin&quo
localhost:8000
匹配,我得到了预期的输出,但不是localhost:8000/admin/test
。当我尝试在浏览器上匹配/admin/test
时,我得到了404
我希望以这种方式组织代码,因为我希望在每个包中包含路由和其他子例程
项目结构
/admin
admin.go
main.go
梅因,加油
package main
import (
"example.com/liondancer/playground/admin"
"fmt"
"github.com/gorilla/mux"
"log"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there!")
}
func main() {
r := mux.NewRouter()
r.HandleFunc("/", handler)
r.PathPrefix("/admin").Handler(admin.NewHandler())
log.Fatal(http.ListenAndServe(":8000", r))
}
管理员,开始
package admin
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
type Handler struct {
router *mux.Router
}
func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
h.router.ServeHTTP(w, r)
}
func NewHandler() *Handler {
h := &Handler{}
r := mux.NewRouter()
h.router = r
h.addRoutes()
return h
}
func (h *Handler) addRoutes() {
fmt.Print("hi here"). // <--- printed here to prove func gets ran.
h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "test")
})
}
包管理
进口(
“fmt”
“net/http”
“github.com/gorilla/mux”
)
类型处理程序结构{
路由器*mux.router
}
func(h*Handler)ServeHTTP(w http.ResponseWriter,r*http.Request){
h、 路由器服务TTP(w,r)
}
func NewHandler()*处理程序{
h:=&处理程序{}
r:=mux.NewRouter()
h、 路由器=r
h、 addRoutes()
返回h
}
func(h*处理程序)addRoutes(){
fmt.Print(“hi here”)。//我能够使用子计算机()运行此代码。
下面是一个Subrouter()
用法示例的链接
如果要将其分离到另一个文件中,也可以这样做:
func main() {
r := mux.NewRouter()
r.HandleFunc("/", handler)
subRoute := r.PathPrefix("/admin").Subrouter()
NewHandler(subRoute)
log.Fatal(http.ListenAndServe(":8000", r))
}
func NewHandler(r* mux.Router) *Handler {
h := &Handler{}
h.router = r
h.AddRoutes()
return h
}
func (h *Handler) AddRoutes() {
fmt.Print("hi here") // <--- printed here to prove func gets ran.
h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "test")
})
}
func main(){
r:=mux.NewRouter()
r、 HandleFunc(“/”,handler)
子例程:=r.PathPrefix(“/admin”).Subcuter()
NewHandler(子例程)
log.Fatal(http.ListenAndServe(“:8000”,r))
}
func NewHandler(r*mux.Router)*处理程序{
h:=&处理程序{}
h、 路由器=r
h、 AddRoutes()
返回h
}
func(h*处理程序)AddRoutes(){
fmt.Print(“hi here”)/我能够使用子计算机()运行此代码。
下面是一个Subrouter()
用法示例的链接
如果要将其分离到另一个文件中,也可以这样做:
func main() {
r := mux.NewRouter()
r.HandleFunc("/", handler)
subRoute := r.PathPrefix("/admin").Subrouter()
NewHandler(subRoute)
log.Fatal(http.ListenAndServe(":8000", r))
}
func NewHandler(r* mux.Router) *Handler {
h := &Handler{}
h.router = r
h.AddRoutes()
return h
}
func (h *Handler) AddRoutes() {
fmt.Print("hi here") // <--- printed here to prove func gets ran.
h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "test")
})
}
func main(){
r:=mux.NewRouter()
r、 HandleFunc(“/”,handler)
子例程:=r.PathPrefix(“/admin”).Subcuter()
NewHandler(子例程)
log.Fatal(http.ListenAndServe(“:8000”,r))
}
func NewHandler(r*mux.Router)*处理程序{
h:=&处理程序{}
h、 路由器=r
h、 AddRoutes()
返回h
}
func(h*处理程序)AddRoutes(){
fmt.Print(“hi here”)//您的嵌套处理程序从不匹配,因为您没有删除前面处理程序的URL前缀。
一个快速解决方案来说明我的意思:
// h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
// quick fix
h.router.HandleFunc("/admin/test", func(w http.ResponseWriter, r *http.Request) {
显然,您希望嵌套的处理程序不知道它是如何嵌套的,因此在注册子处理程序时,去掉URL前缀,以便子处理程序匹配:
// r.PathPrefix("/admin").Handler(admin.NewHandler())
// better
r.PathPrefix("/admin/").Handler(
http.StripPrefix(
"/admin",
admin.NewHandler(),
),
)
您的嵌套处理程序从不匹配,因为您没有删除先前处理程序的URL前缀。
一个快速解决方案来说明我的意思:
// h.router.HandleFunc("/test", func(w http.ResponseWriter, r *http.Request) {
// quick fix
h.router.HandleFunc("/admin/test", func(w http.ResponseWriter, r *http.Request) {
显然,您希望嵌套的处理程序不知道它是如何嵌套的,因此在注册子处理程序时,去掉URL前缀,以便子处理程序匹配:
// r.PathPrefix("/admin").Handler(admin.NewHandler())
// better
r.PathPrefix("/admin/").Handler(
http.StripPrefix(
"/admin",
admin.NewHandler(),
),
)