Skip to content

Latest commit

 

History

History
134 lines (114 loc) · 8.58 KB

05.01.md

File metadata and controls

134 lines (114 loc) · 8.58 KB

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,
	})
}