gf框架之路由控制 – 強大、靈活、高效

NO IMAGE

文章來源:http://gf.johng.cn/494375

gf框架提供了自建的非常強大的路由控制功能,支援流行的命名匹配規則及模糊匹配規則,並提供了優秀的優先順序管理機制。以下是一個服務註冊中使用路由控制的示例:

package main

import "gitee.com/johng/gf/g/net/ghttp"

func main() {
    s := ghttp.GetServer()
    s.BindHandler("/:name", func(r *ghttp.Request){
        r.Response.Writeln("pattern: /:name match")
        r.Response.Writeln(r.Get("name"))
    })
    s.BindHandler("/:name/:action", func(r *ghttp.Request){
        r.Response.Writeln("pattern: /:name/:action match")
        r.Response.Writeln(r.Get("name"))
        r.Response.Writeln(r.Get("action"))
    })
    s.BindHandler("/:name/*any", func(r *ghttp.Request){
        r.Response.Writeln("pattern: /:name/*any match")
        r.Response.Writeln(r.Get("name"))
        r.Response.Writeln(r.Get("any"))
    })
    s.SetPort(8199)
    s.Run()
}

其中,/:name/:action

路由規則分為兩種:靜態路由規則動態路由規則

靜態路由規則

靜態路由規則是指不帶任何命名匹配和模糊匹配的路由規則,即是一個確定的URI地址,例如:/user/info

匹配示例2:

rule: /:name/action

/john/name                no match
/john/action              match
/smith/info               no match
/smith/info/age           no match
/smith/action             match

匹配示例3:

rule: /:name/:action

/john/name                match
/john/info                match
/smith/info               match
/smith/info/age           no match
/smith/action/del         no match

模糊匹配規則

使用*any

匹配示例2:

rule: /src/*path/:action

/src/                     no match
/src/somefile.go          no match
/src/somefile.go/del      match
/src/subdir/file.go/del   match

匹配示例3:

rule: /src/*path/show

/src/                     no match
/src/somefile.go          no match
/src/somefile.go/del      no match
/src/somefile.go/show     match
/src/subdir/file.go/show  match

路由優先順序控制

優先順序控制最主要的兩點因素:

層級越深的規則優先順序越高

命名匹配比模糊匹配優先順序高

我們來看示例(左邊的規則優先順序比右邊高):

/:name                   >            /*any
/user/name               >            /user/:action
/:name/info              >            /:name/:action
/:name/:action           >            /:name/*action
/src/path/del            >            /src/path
/src/path/del            >            /src/path/:action
/src/path/*any           >            /src/path

本章節開頭的示例中已經能夠很好的說明優先順序控制,這裡便不再舉例。