我很难理解如何同时使用negroni和httprouter。
我有两条公共路线,例如/api/v1/ping
我有一堆需要身份验证中间件的专用路由,例如/api/v1/user
如果我要为所有路由都使用negroni通用中间件,但只想将auth中间件和其他中间件应用于私有路由,该如何设置呢?
v1.router := httprouter.New()
v1.router.GET("/api/v1/ping", v1.ping)
v1.router.GET("/api/v1/user", v1.getUsers)
n := negroni.Classic()
n.UseHandler(v1.router)
http.ListenAndServe(port, n)
答案 0 :(得分:1)
您可以尝试将“ Path Prefix Middleware in Go ”中描述的技术与另一个路由器(net/http/#ServeMux
)配合使用,该技术正在使用gorilla/mux
,但对于julienschmidt/httprouter
有效以及:
基于路由前缀指定中间件
这是发生魔术的地方,也是使事情变得混乱的地方。
我发现为路径前缀指定中间件的简便方法是设置第二个复用器(我们在下面使用
sirMuxalot
变量),该复用器具有要向其中应用中间件的路径前缀,并且然后传入我们的原始路由器,该路由器包装在一些中间件中,用于这些路由。之所以可行,是因为除非我们定义的路径前缀与传入的Web请求的路径匹配,否则
sirMuxalot
路由器将永远不会调用中间件包装的路由器。sirMuxalot := http.NewServeMux() sirMuxalot.Handle("/", r) sirMuxalot.Handle("/api/", negroni.New( negroni.HandlerFunc(APIMiddleware), negroni.Wrap(r), )) sirMuxalot.Handle("/dashboard/", negroni.New( negroni.HandlerFunc(DashboardMiddleware), negroni.Wrap(r), )) n := negroni.Classic() n.UseHandler(sirMuxalot) http.ListenAndServe(":3000", n)