优先规则
层次深的优先
/a/b/*any #优先 3层 > 2层
/a/b # 2层
静态优先
/a/b/update # 优先
/a/b/*any # 最后
/a/b/{field}.html # 次优先
路由约束
method:path@domain 约束请求方式,路径,域名
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
// 如果要全部绑定域名,使用带域名的Server进行注册
// g.Server().Domain("www.xrx.com")
// 该路由规则仅会在GET请求下有效
s.BindHandler("GET:/book/{field}.html", func(r *ghttp.Request) {
r.Response.WriteJson(r.Router)
})
// 该路由规则仅会在GET请求及xrx.com域名下有效
s.BindHandler("GET:/book/:id/info@www.xrx.com", func(r *ghttp.Request) {
r.Response.WriteJson(r.Router)
})
// 该路由规则仅会在DELETE请求下有效
s.BindHandler("DELETE:/book/{id}", func(r *ghttp.Request) {
r.Response.WriteJson(r.Router)
})
s.SetPort(8199)
s.Run()
}
路由中获取参数
GetRouter (key,default) 获取路由中的动态参数
package main
import (
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
s.BindHandler("GET:/book/*any", func(r *ghttp.Request) {
any := r.GetRouter("any", "empty")
r.Response.WriteJson(fmt.Sprintf("{\"any\":\"%s\"}", any))
})
s.SetPort(8199)
s.Run()
}
路由注册
package main
import (
"context"
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
type MyController struct {
}
func (my *MyController) Look(r *ghttp.Request) {
r.Response.Writeln("函数注册")
}
func (my *MyController) See(r *ghttp.Request) {
r.Response.Writeln("函数注册")
}
type Api struct{}
func (api *Api) Index(r *ghttp.Request) {
r.Response.Writeln("函数注册")
}
func (api *Api) Login(r *ghttp.Request) {
r.Response.Writeln("登陆")
}
func (api *Api) Logout(r *ghttp.Request) {
r.Response.Writeln("退出")
}
func (api *Api) Detail(r *ghttp.Request) {
r.Response.Writeln("详情页")
}
type PersonReq struct {
g.Meta `path:"/see" method:"get"`
Name string `v:"required" dc:"Your name"`
}
type PersonRes struct {
Reply string `dc:"Reply content"`
}
type Person struct{}
func (Person) Say(ctx context.Context, req *PersonReq) (res *PersonRes, err error) {
g.Log().Debugf(ctx, `receive say: %+v`, req)
res = &PersonRes{
Reply: fmt.Sprintf(`Hi %s`, req.Name),
}
return
}
func main() {
s := g.Server()
s.Use(ghttp.MiddlewareHandlerResponse)
// 函数注册
s.BindHandler("GET:/a", func(r *ghttp.Request) {
r.Response.Writeln("函数注册")
})
// 结构体注册 注册 MyController的Look方法
s.BindObject("POST:/b", new(MyController), "Look")
s.SetPort(8000)
//分组路由
group := s.Group("/")
group.POST("/c", func(r *ghttp.Request) {
r.Response.Writeln("分组路由")
})
//批量注册,group.Map支持method约束
api := Api{}
s.Group("/", func(group *ghttp.RouterGroup) {
group.Map(g.Map{
"POST:/index": api.Index,
"/Login": api.Login,
"/Logout": api.Logout,
"/detail": api.Detail,
})
//标准路由,即定义request,response struct,在其中对数据进行约束
group.Bind(new(Person))
})
group.POST("/c", new(MyController))
s.Run()
}