查看已注册路由

在排查问题的时候,我们可能想知道,整个系统究竟注册了哪些路由。Web 提供了一个非常有用的方法web.PrintTree(),该方法会把所有注册的路由信息返回,而后我们就可以依次遍历打印:

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/beego/beego/v2/server/web"
  5. )
  6. type UserController struct {
  7. web.Controller
  8. }
  9. func (u *UserController) HelloWorld() {
  10. u.Ctx.WriteString("hello, world")
  11. }
  12. func main() {
  13. web.BConfig.RouterCaseSensitive = false
  14. web.AutoRouter(&UserController{})
  15. tree := web.PrintTree()
  16. methods := tree["Data"].(web.M)
  17. for k, v := range methods {
  18. fmt.Printf("%s => %v\n", k, v)
  19. }
  20. }

如果要是注册的路由,使用了*作为方法,也就是匹配任何 HTTP 方法,那么就会每个方法打印出来一个。AutoRouter就是匹配任何的 HTTP 方法,所以最终会打印出来一堆内容:

  1. MKCOL => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  2. CONNECT => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  3. POST => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  4. UNLOCK => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  5. PROPFIND => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  6. PATCH => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  7. GET => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  8. DELETE => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  9. PROPPATCH => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  10. COPY => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  11. OPTIONS => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  12. HEAD => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  13. LOCK => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  14. PUT => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  15. TRACE => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]
  16. MOVE => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]

我们用POST => &[[/user/helloworld/* map[*:HelloWorld] main.UserController]]作为例子来展示该如何解读: 它表示的是,POST 方法访问 /user/helloworld/*这种模式的路径, 那么它会执行main.UserController里面的HelloWorld方法。

相关内容