如何将我的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

我正在尝试实现appHandler code>: //blog.golang.org/error-handling-and-go#TOC_3“。 rel =“ nofollow”> Go博客:错误处理和Go 。 我有 appHandler code>,现在我只是想将其连接到我的路线。 以下工作原理: p>

  router:= new(mux.Router)
router.Handle(“ / my / route /”,handlers.AppHandler(handlers.MyRoute))\  n  code>  pre> 
 
 

但是,我希望能够允许GET请求以及具有“ StrictSlash(true)”。 我有: p>

 类型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> 
 
 

AppHandler看起来像: p>

  type AppHandler func(http.ResponseWriter,* http.Request)* appError 
 
func(  fn AppHandler)ServeHTTP(w http.ResponseWriter,r * http.Request){
 //等等,等等,
} 
  code>  pre> 
 
 

我收到错误 : p>

 不能在字段值中使用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)
}