router是一个go语言的路由分发包
特性
- 支持自定义正则匹配路由
- 支持restful
- 支持Middleware
- 支持Hook
安装
go get -u github.com/zakzou/router
快速开始
1. 实例化路由
import ( "github.com/zakzou/router" ) r := router.NewRouter()
1.1 默认不会严格匹配斜杠,如果需要匹配,则需要设置
r.StrictSlash(true)
1.2 也可以使用连缀方式
r := route.NewRouter().StrictSlash(true)
2. 注册路由
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)
2.3 注册命名路由
home.Name("home")
2.4 路由也支持模式匹配
intanystring<[pattern:]paramName>
r.HandleFunc("/<param1>/<string:params2>/<int:user_id>/", 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) })
3. 注册中间件(Middleware)
中间件会在路由被调用之前调用,一个路由可以注册多个中间件
home.MiddlewareFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln("Middleware 1") })
3.1 也可以为所有路由注册中间件
r := router.NewRouter().MiddlewareFunc(func(w http.ResponseWriter, r *http.Request) { fmt.Fprintln("Middleware 0") })
4. 注册钩子
钩子会在执行路由的前后调用,目前支持2对钩子
HookBeforeRouterHookBeforeDispatchHookAfterRouterHookAfterDispatchHookBeforeDispatchHookAfterDispatch
r.HookFunc(HookAfterDispatch, func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "hook") })
5. 生成地址
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) }
6. 运行
if err := http.ListenAndServe(":9999", r); err != nil { println(err.Error()) }