PathPrefixed Subrouter与单独的处理程序

时间:2015-03-03 07:16:02

标签: go mux gorilla

鉴于以下内容(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()根目录上的处理程序是否可以阻止任何其他路由匹配?

1 个答案:

答案 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)

然后事情就完美了。