路由匹配

Tango支持4种形式的路由匹配规则

  • 静态路由
    1. tg.Get("/", new(Action))
    2. tg.Get("/static", new(Action))
    匹配 URL:/ 到 Action结构体的Get函数 匹配 URL:/static 到 Action结构体的Get函数
  • 命名路由

    1. tg.Get("/:name", new(Action))
    2. tg.Get("/(:name)", new(Action))
    3. tg.Get("/:name1/:name2", new(Action))
    4. tg.Get("/:name1-:name2", new(Action))
    5. tg.Get("/(:name1)sss(:name2)", new(Action))
  • 通配路由

    1. tg.Get("/*name", new(Action))
    2. tg.Get("/ttt/*name", new(Action))
    3. tg.Get("/sss(*name)", new(Action))

    路由参数支持*通配符

  • 正则路由
  1. tg.Get("/(:name.*)", new(Action))
  2. tg.Get("/(:name[0-9]+)", new(Action))
  3. tg.Get("/(:name1)-(:name2[0-9]+)", new(Action))

路由参数支持正则约束,不符合条件的参数会抛出404错误

路由定义

除了可以用Get Post等方法来定义外,也可以使用Route来绑定路由,形式更灵活

  • GET请求

    1. t.Route("GET", "/", new(Action))
  • 自定义方法名 ```Go type Action struct {} func (Action) MyPost() {}

t.Route(“POST:MyPost”, “/“, new(Action))

  1. * 一次定义多个
  2. ```Go
  3. t.Route([]string{"GET:MyGet", "POST"}, "/", new(Action))
  • 自定义多个
    1. t.Route(map[string]string{"GET":"MyGet", "POST":"MyPost"}, "/", new(Action))

路由优先级

  • 静态路由和其它形式的路由都匹配时,静态路由优先,跟添加的顺序无关,如:

    1. /abc
    2. /(:name)

    那么对于请求/abc,则/abc会匹配

  • 多个动态路由均匹配时,先出现静态部分的路由优先,如:

    1. "/(:name1)/(:name1)abc"
    2. "/(:name1)/abc(:name1)abc(:name2)abc"

    那么对于请求/abc/abc123abc123abc,则/(:name1)/abc(:name1)abc(:name2)abc会匹配

  • 其它路由之间根据添加的顺序,先添加的优先。

路由参数

请求路径匹配后的参数可以通过*Context获得:

  • 命名路由和正则路由: ctx.Param(":name") 或者 ctx.Param("name")
  • 通配路由:ctx.Param("*name")

GET参数获取实例

  1. import "github.com/tango-contrib/binding"
  2. type Getuser struct {
  3. tango.JSON
  4. tango.Ctx
  5. binding.Binder
  6. }
  7. func (this *Getuser) Get() interface{} {
  8. type GetStruct struct {
  9. Name string
  10. }
  11. var data GetStruct
  12. err := this.Bind(&data)
  13. if err != nil {
  14. return map[string]interface{}{
  15. "res": "no",
  16. "msg": "get param error",
  17. "err:": err,
  18. "status": 500,
  19. }
  20. }
  21. fmt.Println(data.Name)//取值
  22. .....
  23. }
  24. //路由
  25. func main() {
  26. t := tango.Classic()
  27. t.Use(binding.Bind())
  28. t.Get("/api/1.0/users", new(Getuser))
  29. ......

POST参数获取实例:JSON格式

  1. type Settid struct {
  2. tango.JSON
  3. tango.Ctx
  4. }
  5. func (this *Settid) Post() interface{} {
  6. type jsondata struct {
  7. Uid string `json:"Uid"`
  8. Tid string `json:"Tid"`
  9. Aim_sn string `json:"Aim_sn"`
  10. }
  11. var data jsondata
  12. err = this.DecodeJSON(&data)
  13. if err != nil {
  14. return map[string]interface{}{
  15. "res": "no",
  16. "msg": "DecodeJSON error",
  17. "err:": err,
  18. "status": 500,
  19. }
  20. }
  21. fmt.Println(data.Uid)//取值
  22. .....
  23. }
  24. //路由
  25. func main() {
  26. t := tango.Classic()
  27. t.Post("/inapi/1.0/setaiport", new(Settid))
  28. ...

获取路由传参示例

代码

  1. package main
  2. import (
  3. "github.com/lunny/tango"
  4. )
  5. type Node struct {
  6. tango.Ctx
  7. }
  8. func (this *Node) Get() interface{} {
  9. return this.Param("name")
  10. }
  11. func main() {
  12. tg := tango.Classic()
  13. tg.Route("GET", "/node/:name", new(Node))
  14. tg.Run()
  15. }

效果

  1. $ curl http://localhost:8000/node/helloworld
  2. helloworld