5.1 两种注册形式

Faygo注册路由的写法有两种形式,根据个人喜好可自行选择。

假设我们需要注册到路由器的Handler如下:

  1. // 新建应用服务,参数:名称、版本
  2. var app = faygo.New("myapp", "1.0")
  3. func Count(prefix string) faygo.HandlerFunc {
  4. var count uint64
  5. return func(ctx *faygo.Context) error {
  6. count++
  7. return ctx.String(200, "%s %d", prefix, count)
  8. }
  9. }
  10. var Name = faygo.HandlerFunc(func(ctx *faygo.Context) error {
  11. return ctx.String(200, "faygo")
  12. })
  13. type Addition struct {
  14. TheOne int `param:"<in:query> <desc:plus number> <range: 0:100>"`
  15. OtherOne int `param:"<in:query> <name:other> <desc:other plus number>"`
  16. }
  17. func (a *Addition) Serve(ctx *faygo.Context) error {
  18. return ctx.String(200, "(%d) + (%d) = %d", a.TheOne, a.OtherOne, a.TheOne+a.OtherOne)
  19. }

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

示例:

  1. // 注册路由
  2. app.Route(
  3. // 新建func Handler路由
  4. app.NewNamedGET("测试1 func Handler 计数", "/count", Count("num")),
  5. app.NewNamedGET("测试2 func Handler 打印名字", "/name", Name),
  6. // 新建home分组
  7. app.NewGroup("home",
  8. // 新建绑定参数的struct Handler路由
  9. app.NewNamedGET("测试struct Handler的自动绑定参数", "/addition", &Addition{
  10. // 为绑定的参数设定API文档中缺省值(可选)
  11. TheOne: 1,
  12. OtherOne: 2,
  13. }),
  14. ),
  15. )

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的实例直接调用链式路由注册方法。

示例:

  1. // 注册func Handler路由
  2. app.NamedGET("测试1 func Handler 计数", "/count", Count("num"))
  3. app.NamedGET("测试2 func Handler 打印名字", "/name", Name)
  4. // 注册home分组
  5. {
  6. home := app.Group("home")
  7. // 注册绑定参数的struct Handler路由
  8. home.NamedGET("测试struct Handler的自动绑定参数", "/addition", &Addition{
  9. // 为绑定的参数设定API文档中缺省值(可选)
  10. TheOne: 1,
  11. OtherOne: 2,
  12. })
  13. }