5.1 两种注册形式
Faygo注册路由的写法有两种形式,根据个人喜好可自行选择。
假设我们需要注册到路由器的Handler如下:
// 新建应用服务,参数:名称、版本
var app = faygo.New("myapp", "1.0")
func Count(prefix string) faygo.HandlerFunc {
var count uint64
return func(ctx *faygo.Context) error {
count++
return ctx.String(200, "%s %d", prefix, count)
}
}
var Name = faygo.HandlerFunc(func(ctx *faygo.Context) error {
return ctx.String(200, "faygo")
})
type Addition struct {
TheOne int `param:"<in:query> <desc:plus number> <range: 0:100>"`
OtherOne int `param:"<in:query> <name:other> <desc:other plus number>"`
}
func (a *Addition) Serve(ctx *faygo.Context) error {
return ctx.String(200, "(%d) + (%d) = %d", a.TheOne, a.OtherOne, a.TheOne+a.OtherOne)
}
5.1.1 树状写法
树状写法就是以无限嵌套的形式注册路由树,层级结构清晰一目了然。使用fay工具创建的新项目就是采用这种形式。
用于树状写法的方法列表:
用途 | 方法定义 |
---|---|
注册路由树的起始方法(最外层根节点) | func (frame *Framework) Route(children ...*MuxAPI) *MuxAPI |
新建任意方法的路由节点(多方法间可用任意字符串间隔) | func (frame *Framework) NewAPI(methodset Methodset, pattern string, handlers ...Handler) *MuxAPI |
新建DELETE方法的路由节点 | func (frame *Framework) NewDELETE(pattern string, handlers ...Handler) *MuxAPI |
新建GET方法的路由节点 | func (frame *Framework) NewGET(pattern string, handlers ...Handler) *MuxAPI |
新建路由分组(节点树) | func (frame *Framework) NewGroup(pattern string, children ...*MuxAPI) *MuxAPI |
新建HEAD方法的路由节点 | func (frame *Framework) NewHEAD(pattern string, handlers ...Handler) *MuxAPI |
新建指定名称的任意方法的路由节点(多方法间可用任意字符串间隔) | func (frame *Framework) NewNamedAPI(name string, methodset Methodset, pattern string, handlers ...Handler) *MuxAPI |
新建指定名称的DELETE方法的路由节点 | func (frame *Framework) NewNamedDELETE(name string, pattern string, handlers ...Handler) *MuxAP |
新建指定名称的GET方法的路由节点 | func (frame *Framework) NewNamedGET(name string, pattern string, handlers ...Handler) *MuxAP |
新建指定名称的路由分组(节点树) | func (frame *Framework) NewNamedGroup(name string, pattern string, children ...*MuxAPI) *MuxAP |
新建指定名称的HEAD方法的路由节点 | func (frame *Framework) NewNamedHEAD(name string, pattern string, handlers ...Handler) *MuxAP |
新建指定名称的OPTIONS方法的路由节点 | func (frame *Framework) NewNamedOPTIONS(name string, pattern string, handlers ...Handler) *MuxAP |
新建指定名称的PATCH方法的路由节点 | func (frame *Framework) NewNamedPATCH(name string, pattern string, handlers ...Handler) *MuxAP |
新建指定名称的POST方法的路由节点 | func (frame *Framework) NewNamedPOST(name string, pattern string, handlers ...Handler) *MuxAP |
新建指定名称的PUT方法的路由节点 | func (frame *Framework) NewNamedPUT(name string, pattern string, handlers ...Handler) *MuxAP |
新建指定名称的静态文件目录的路由节点 | func (frame *Framework) NewNamedStatic(name, pattern string, root string, nocompressAndNocache ...bool) *MuxAP |
新建指定名称的静态文件系统的路由节点 | func (frame *Framework) NewNamedStaticFS(name, pattern string, fs FileSystem) *MuxAP |
新建OPTIONS方法的路由节点 | func (frame *Framework) NewOPTIONS(pattern string, handlers ...Handler) *MuxAP |
新建PATCH方法的路由节点 | func (frame *Framework) NewPATCH(pattern string, handlers ...Handler) *MuxAPI |
新建POST方法的路由 | func (frame *Framework) NewPOST(pattern string, handlers ...Handler) *MuxAPI |
新建PUT方法的路由 | func (frame *Framework) NewPUT(pattern string, handlers ...Handler) *MuxAPI |
新建静态文件目录的路由节点 | func (frame *Framework) NewStatic(pattern string, root string, nocompressAndNocache ...bool) *MuxAPI |
新建静态文件系统的路由节点 | func (frame *Framework) NewStaticFS(pattern string, fs FileSystem) *MuxAPI |
示例:
// 注册路由
app.Route(
// 新建func Handler路由
app.NewNamedGET("测试1 func Handler 计数", "/count", Count("num")),
app.NewNamedGET("测试2 func Handler 打印名字", "/name", Name),
// 新建home分组
app.NewGroup("home",
// 新建绑定参数的struct Handler路由
app.NewNamedGET("测试struct Handler的自动绑定参数", "/addition", &Addition{
// 为绑定的参数设定API文档中缺省值(可选)
TheOne: 1,
OtherOne: 2,
}),
),
)
5.1.2 链状写法
链状写法是以扁平化的代码书写,逐级利用中间变量或.
来注册下级路由节点/树。写法更加自由,更适合在复杂场景或路由信息量较大的情况使用。
用于链状写法的方法列表:
用途 | 方法定义 |
---|---|
注册任意方法的路由节点(多方法间可用任意字符串间隔) | func (mux *MuxAPI) API(methodset Methodset, pattern string, handlers ...Handler) *MuxAPI |
注册DELETE方法的路由节点 | func (mux *MuxAPI) DELETE(pattern string, handlers ...Handler) *MuxAPI |
注册GET方法的路由节点 | func (mux *MuxAPI) GET(pattern string, handlers ...Handler) *MuxAPI |
注册路由分组(节点树) | func (mux *MuxAPI) Group(pattern string, children ...*MuxAPI) *MuxAPI |
注册HEAD方法的路由节点 | func (mux *MuxAPI) HEAD(pattern string, handlers ...Handler) *MuxAPI |
注册指定名称的任意方法的路由节点(多方法间可用任意字符串间隔) | func (mux *MuxAPI) NamedAPI(name string, methodset Methodset, pattern string, handlers ...Handler) *MuxAPI |
注册指定名称的DELETE方法的路由节点 | func (mux *MuxAPI) NamedDELETE(name string, pattern string, handlers ...Handler) *MuxAP |
注册指定名称的GET方法的路由节点 | func (mux *MuxAPI) NamedGET(name string, pattern string, handlers ...Handler) *MuxAP |
注册指定名称的路由分组(节点树) | func (mux *MuxAPI) NamedGroup(name string, pattern string, children ...*MuxAPI) *MuxAP |
注册指定名称的HEAD方法的路由节点 | func (mux *MuxAPI) NamedHEAD(name string, pattern string, handlers ...Handler) *MuxAP |
注册指定名称的OPTIONS方法的路由节点 | func (mux *MuxAPI) NamedOPTIONS(name string, pattern string, handlers ...Handler) *MuxAP |
注册指定名称的PATCH方法的路由节点 | func (mux *MuxAPI) NamedPATCH(name string, pattern string, handlers ...Handler) *MuxAP |
注册指定名称的POST方法的路由节点 | func (mux *MuxAPI) NamedPOST(name string, pattern string, handlers ...Handler) *MuxAP |
注册指定名称的PUT方法的路由节点 | func (mux *MuxAPI) NamedPUT(name string, pattern string, handlers ...Handler) *MuxAP |
注册指定名称的静态文件目录的路由节点 | func (mux *MuxAPI) NamedStatic(name, pattern string, root string, nocompressAndNocache ...bool) *MuxAP |
注册指定名称的静态文件系统的路由节点 | func (mux *MuxAPI) NamedStaticFS(name, pattern string, fs FileSystem) *MuxAP |
注册OPTIONS方法的路由节点 | func (mux *MuxAPI) OPTIONS(pattern string, handlers ...Handler) *MuxAP |
注册PATCH方法的路由节点 | func (mux *MuxAPI) PATCH(pattern string, handlers ...Handler) *MuxAPI |
注册POST方法的路由 | func (mux *MuxAPI) POST(pattern string, handlers ...Handler) *MuxAPI |
注册PUT方法的路由 | func (mux *MuxAPI) PUT(pattern string, handlers ...Handler) *MuxAPI |
注册静态文件目录的路由节点 | func (mux *MuxAPI) Static(pattern string, root string, nocompressAndNocache ...bool) *MuxAPI |
注册静态文件系统的路由节点 | func (mux *MuxAPI) StaticFS(pattern string, fs FileSystem) *MuxAPI |
由于在faygo源码中,结构体类型Framework
包含嵌入式字段*MuxAPI
,所以我们可以用*Framework
的实例直接调用链式路由注册方法。
示例:
// 注册func Handler路由
app.NamedGET("测试1 func Handler 计数", "/count", Count("num"))
app.NamedGET("测试2 func Handler 打印名字", "/name", Name)
// 注册home分组
{
home := app.Group("home")
// 注册绑定参数的struct Handler路由
home.NamedGET("测试struct Handler的自动绑定参数", "/addition", &Addition{
// 为绑定的参数设定API文档中缺省值(可选)
TheOne: 1,
OtherOne: 2,
})
}