用于公共和私有路由中间件的httprouter和negroni

时间:2019-10-19 02:28:23

标签: go negroni

我很难理解如何同时使用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)

1 个答案:

答案 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)