鉴于以下内容(complete example at Go playground):
// Collection
root := r.PathPrefix("/widgets/").Subrouter()
root.Methods("POST").Handler(h.Create)
// Individual
object := root.PathPrefix("/{uuid}").Subrouter()
// ~neither: object := root.PathPrefix("/{uuid}").Subrouter()
object.Methods("GET").Handler(h.Show)
object.Methods("PUT").Handler(h.Replace)
object.Methods("DELETE").Handler(h.Delete)
// Relationships
object.Methods("GET").Path("/foos").Handler(eh.Foos)
object.Methods("GET").Path("/bars").Handler(eh.Bars)
我希望以下网址可以触发相应的处理程序,但我似乎无法使其正常工作:
✔ POST /widgets => h.Create
✔ GET /widgets/123 => h.Show (assumes PathPrefix('/{uuid}'))
✔ GET /widgets/123/ => h.Show (required if 'PathPrefix('/{uuid}/')')
✖ GET /widgets/123/foos => h.Foos (actually routes h.Show)
✖ GET /widgets/123/bars => h.Bars (actually routes h.Show)
不幸的是,最后两个都没有显然可路由,它们都触发h.Show
,任何人都可以指出我做错了什么吗?我可能已经预料到有一个无界{uuid}
(没有尾部斜线)可能会导致运行,忽略/
但似乎不是这样。
我甚至不知道这是否与Subrouter严格斜线问题有关,这个问题仍在Github上开放(#31),但据我所知,我确实在那里尝试了替代方案。 (即object.Methods("GET").Path("/").Handler(h.Show)
)
通过object
安装在Methods()
根目录上的处理程序是否可以阻止任何其他路由匹配?
答案 0 :(得分:2)
问题是gorilla/mux
触发了第一个匹配的处理程序。重要的是 第一个匹配处理程序 。
这意味着永远找不到 /{id}/
下的逻辑路由,因为匹配它们的路由首先由父处理程序匹配。
将代码更改为以下内容使其按预期工作:
// Collection
root := r.PathPrefix("/widgets/").Subrouter()
object := root.PathPrefix("/{uuid}").Subrouter()
// Relationships
object.Methods("GET").Path("/foos").Handler(eh.Foos)
object.Methods("GET").Path("/bars").Handler(eh.Bars)
// Individual
root.Methods("POST").Handler(h.Create)
object.Methods("GET").Handler(h.Show)
object.Methods("PUT").Handler(h.Replace)
object.Methods("DELETE").Handler(h.Delete)
然后事情就完美了。