有没有办法让当前路线触发http.HandleFunc
?也许是这样的?
http.HandleFunc("/foo/", serveFoo)
func serveFoo(rw http.ResponseWriter, req *http.Request) {
fmt.Println(http.CurrentRoute())
// Should print "/foo/"
}
我想获得当前路线的原因是因为我发现自己经常编写这样的代码。
if req.URL.Path != "/some-route/" {
http.NotFound(resp, req)
return
}
// or
key := req.URL.Path[len("/some-other-route/"):]
如果代码更像拷贝,模块化和DRY,那就太好了。
if req.URL.Path != http.CurrentRoute() {
http.NotFound(resp, req)
return
}
// or
key := req.URL.Path[http.CurrentRoute():]
这实际上只是一件小事,所以我宁愿不将其他依赖项带入我的项目(Gorilla Mux)。
答案 0 :(得分:1)
无法获取匹配的当前路由,但可以消除方案中的重复代码。编写一个处理程序,在调用另一个处理程序之前检查路径:
func HandleFuncExact(mux *http.ServeMux, pattern string, handler func(http.ResponseWriter, *http.Request) {
mux.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
if req.URL.Path != pattern {
http.NotFound(w, r)
return
}
handler(w, r)
})
}
在您的应用程序中,调用包装器而不是HandlFunc:
HandleFuncExact(http.DefaultServeMux, "/some-route/", serveSomeRoute)
函数serveSomeRoute
可以假设路径正好是" / some-route /"。