路由
在Martini中, 路由是一个HTTP方法配对一个URL匹配模型. 每一个路由可以对应一个或多个处理器方法:
- m.Get("/", func() {
- // 显示
- })
- m.Patch("/", func() {
- // 更新
- })
- m.Post("/", func() {
- // 创建
- })
- m.Put("/", func() {
- // 替换
- })
- m.Delete("/", func() {
- // 删除
- })
- m.Options("/", func() {
- // http 选项
- })
- m.NotFound(func() {
- // 处理 404
- })
路由匹配的顺序是按照他们被定义的顺序执行的. 最先被定义的路由将会首先被用户请求匹配并调用.
路由模型可能包含参数列表, 可以通过martini.Params服务来获取:
- m.Get("/hello/:name", func(params martini.Params) string {
- return "Hello " + params["name"]
- })
路由匹配可以通过正则表达式或者glob的形式:
- m.Get("/hello/**", func(params martini.Params) string {
- return "Hello " + params["_1"]
- })
也可以这样使用正则表达式:
- m.Get("/hello/(?P<name>[a-zA-Z]+)", func(params martini.Params) string {
- return fmt.Sprintf ("Hello %s", params["name"])
- })
有关正则表达式的更多信息请参见Go官方文档.
路由处理器可以被相互叠加使用, 例如很有用的地方可以是在验证和授权的时候:
- m.Get("/secret", authorize, func() {
- // 该方法将会在authorize方法没有输出结果的时候执行.
- })
也可以通过 Group 方法, 将 route 编成一組.
- m.Group("/books", func(r martini.Router) {
- r.Get("/:id", GetBooks)
- r.Post("/new", NewBook)
- r.Put("/update/:id", UpdateBook)
- r.Delete("/delete/:id", DeleteBook)
- })
就像为 handler 增加 middleware 方法一样, 你也可以为一组 routes 增加 middleware.
- m.Group("/books", func(r martini.Router) {
- r.Get("/:id", GetBooks)
- r.Post("/new", NewBook)
- r.Put("/update/:id", UpdateBook)
- r.Delete("/delete/:id", DeleteBook)
- }, MyMiddleware1, MyMiddleware2)