如何将我的AppHandler添加到路线中?
I am trying to implement an appHandler
as described in The Go Blog: Error handling and Go.
I have the appHandler
, now I'm just trying to hook it up to my routes. The following works:
router := new(mux.Router)
router.Handle("/my/route/", handlers.AppHandler(handlers.MyRoute))
But, I want to be able to allow GET requests as well as having "StrictSlash(true)". I have:
type Routes []Route
type Route struct {
Method string
Pattern string
HandlerFunc http.HandlerFunc
}
var routes = Routes{
Route{"GET", "/my/route/", handlers.AppHandler(handlers.MyRoute)}
}
router := mux.NewRouter().StrictSlash(true)
for _, route := range routes {
var handler http.Handler
handler = route.HandlerFunc
router.Methods(route.Method).Path(route.Pattern).Handler(handler)
}
AppHandler looks like:
type AppHandler func(http.ResponseWriter, *http.Request) *appError
func (fn AppHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// blah, blah, blah
}
I get an error:
cannot use handlers.AppHandler(handlers.MyRoute) (type handlers.AppHandler) as type http.HandlerFunc in field value
我正在尝试实现 但是,我希望能够允许GET请求以及具有“ StrictSlash(true)”。 我有: p>
AppHandler看起来像: p>
我收到错误 : p>
appHandler code>,现在我只是想将其连接到我的路线。 以下工作原理: p>
router:= new(mux.Router)
router.Handle(“ / my / route /”,handlers.AppHandler(handlers.MyRoute))\ n code> pre>
类型Routes [] Route
type Route struct {
方法字符串
模式字符串
HandlerFunc http.HandlerFunc
}
var 路线=路线{
路线{“ GET”,“ / my / route /”,handlers.AppHandler(handlers.MyRoute)}
}
router:= mux.NewRouter()。StrictSlash(true)
用于_, route:=范围路由{
var handler http.Handler
handler = route.HandlerFunc
router.Methods(route.Method).Path(route.Pattern).Handler(handler)
}
code > pre>
type AppHandler func(http.ResponseWriter,* http.Request)* appError
func( fn AppHandler)ServeHTTP(w http.ResponseWriter,r * http.Request){
//等等,等等,
}
code> pre>
不能在字段值中使用handlers.AppHandler(handlers.MyRoute)(类型handlers.AppHandler)作为http.HandlerFunc类型
code> pre> \ n div>
Your AppHandler
isn't a http.HandlerFunc
, it's a http.Handler
.
A http.HandlerFunc
is just a function that takes both a http.ResponseWriter
and a *http.Request
.
http.Handler
is an interface that is satisfied by any type that has a method ServeHTTP(w http.ResponseWriter, r *http.Request)
Change your struct to something like
type Route struct {
Method string
Pattern string
Handler http.Handler
}
And then at the bottom you can probably do
for _, route := range routes {
router.Methods(route.Method).Path(route.Pattern).Handler(route.Handler)
}