1

给定以下内容(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)

我本来希望以下 URL 触发相应的处理程序,但我似乎无法使其工作:

✔ 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}(没有尾部斜杠)可能会继续运行,忽略/但似乎并非如此。

我什至不知道这是否与在 Github (#31) 上仍然开放的 Subrouter strict-slash 问题有关,但据我所知,我确实在那里尝试了替代方案。(即object.Methods("GET").Path("/").Handler(h.Show)

安装在object根目录上的处理程序是否可以Methods()防止任何进一步的路由匹配?

4

1 回答 1

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)

然后事情就完美了。

于 2015-03-03T09:22:14.407 回答