router是一个go语言的路由分发包
go get -u github.com/zakzou/router
import ( "github.com/zakzou/router" ) r := router.NewRouter()
默认不会严格匹配斜杠,如果需要匹配,则需要设置
r.StrictSlash(true)
r := route.NewRouter().StrictSlash(true)
home := r.HandleFunc("/home", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "home") })
2.1 默认路只支持GET访问,如果需要支持POST,GET同时访问,可以通过Methods方法
home.Methods("POST", "GET")
2.2 也可以通过连缀方式,也可也支持单个路由不严格匹配斜杠
r.HandleFunc("/home", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "home") }).Methods("GET").StrictSlash(false)
home.Name("home")
也可以自定义则正<[pattern:]paramName>
r.HandleFunc(“////”, func(w http.ResponseWriter, r *http.Request) { query := r.URL.Query() param1 := query.Get(“param1”) param2 := query.Get(“param2”) param3 := query.Get(“param3”) fmt.Fprintln(w, param1, param2, param3) })
注册中间件(Middleware)
中间件会在路由被调用之前调用,一个路由可以注册多个中间件
home.MiddlewareFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln("Middleware 1") })
也可以为所有路由注册中间件
r := router.NewRouter().MiddlewareFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln("Middleware 0") })
钩子会在执行路由的前后调用,目前支持2对钩子
HookAfterDispatch 路由匹配成功后,路由分发之后执行
r.HookFunc(HookAfterDispatch, func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, “hook”) })
UrlFor 可以为命名路由自动生成地址
r.HandleFunc("/user/profile/query/<int:user_id>/", func(w http.ResponseWriter, r *http.Request) { }).Name("profile") if urls, ok := r.UrlFor("profile", map[string]interface{}{"user_id": 100001}); ok { println(urls) }
if err := http.ListenAndServe(":9999", r); err != nil { println(err.Error()) }