路由

在Martini中, 路由是一个HTTP方法配对一个URL匹配模型. 每一个路由可以对应一个或多个处理器方法:

  1. m.Get("/", func() {
  2. // 显示
  3. })
  4.  
  5. m.Patch("/", func() {
  6. // 更新
  7. })
  8.  
  9. m.Post("/", func() {
  10. // 创建
  11. })
  12.  
  13. m.Put("/", func() {
  14. // 替换
  15. })
  16.  
  17. m.Delete("/", func() {
  18. // 删除
  19. })
  20.  
  21. m.Options("/", func() {
  22. // http 选项
  23. })
  24.  
  25. m.NotFound(func() {
  26. // 处理 404
  27. })

路由匹配的顺序是按照他们被定义的顺序执行的. 最先被定义的路由将会首先被用户请求匹配并调用.

路由模型可能包含参数列表, 可以通过martini.Params服务来获取:

  1. m.Get("/hello/:name", func(params martini.Params) string {
  2. return "Hello " + params["name"]
  3. })

路由匹配可以通过正则表达式或者glob的形式:

  1. m.Get("/hello/**", func(params martini.Params) string {
  2. return "Hello " + params["_1"]
  3. })

也可以这样使用正则表达式:

  1. m.Get("/hello/(?P<name>[a-zA-Z]+)", func(params martini.Params) string {
  2. return fmt.Sprintf ("Hello %s", params["name"])
  3. })

有关正则表达式的更多信息请参见Go官方文档.

路由处理器可以被相互叠加使用, 例如很有用的地方可以是在验证和授权的时候:

  1. m.Get("/secret", authorize, func() {
  2. // 该方法将会在authorize方法没有输出结果的时候执行.
  3. })

也可以通过 Group 方法, 将 route 编成一組.

  1. m.Group("/books", func(r martini.Router) {
  2. r.Get("/:id", GetBooks)
  3. r.Post("/new", NewBook)
  4. r.Put("/update/:id", UpdateBook)
  5. r.Delete("/delete/:id", DeleteBook)
  6. })

就像为 handler 增加 middleware 方法一样, 你也可以为一组 routes 增加 middleware.

  1. m.Group("/books", func(r martini.Router) {
  2. r.Get("/:id", GetBooks)
  3. r.Post("/new", NewBook)
  4. r.Put("/update/:id", UpdateBook)
  5. r.Delete("/delete/:id", DeleteBook)
  6. }, MyMiddleware1, MyMiddleware2)