标准处理函数定义:
type (
HandlerFunc func(Context)
HandlerFuncs []HandlerFunc
)
其他框架处理函数都是一个固定的函数,而eudore几乎支持任意处理函数,只需要额外注册一下转换函数,将任意对象转换成eudore.HanderFunc对象即可,在基于路由匹配返回字符串的benckmark测试中,处理函数转换造成的性能丢失低于1%。
基于处理函数扩展机制,可以给处理请求的请求上下文添加任意函数。
可以使用eudore.DefaultHandlerExtend.ListExtendHandlerFun()函数查看内置支持的任意函数类型,如果是注册了不支持的处理函数类型会触发panic。
内置扩展处理函数列表,具有参考源码实现:
NewExtendContextData
NewExtendHandlerHTTPClone
NewExtendHandlerHTTP
NewExtendHandlerNetHTTP
NewExtendFuncNetHTTP1
NewExtendFuncNetHTTP2
NewExtendFuncContextError
NewExtendFuncContextRender
NewExtendFuncContextRenderError
NewExtendFuncRPCMap
NewExtendHandlerRPC
NewExtendFuncString
NewExtendHandlerStringer
example:
func main() {
app := eudore.NewCore()
app.AnyFunc("/*", "hello eudore")
app.GetFunc("/check", func(ctx eudore.Context) error {
if len(ctx.GetQuery("value")) > 3 {
return fmt.Errorf("value is %s len great 3", ctx.GetQuery("value"))
}
return nil
})
app.GetFunc("/data", func(ctx eudore.Context) interface{} {
return map[string]string{
"a": "1",
"b": "2",
}
})
app.Listen(":8080")
app.Run()
}
HandlerExtender
HandlerExtender 定义函数扩展处理者的方法,该功能很强大但是需要慎用以免管理混乱,用于将指定对象转换成HandlerFunsc,默认拥有Base、Warp、Tree三种实现。
Base实现函数扩展的基本实现,Warp实现函数扩展的链式封装,Tree实现函数扩展基于树路径封装。
type HandlerExtender interface {
RegisterHandlerExtend(string, interface{}) error
NewHandlerFuncs(string, interface{}) HandlerFuncs
ListExtendHandlerNames() []string
}
实现一个扩展函数
如果使用请求上下文扩展机制,最好自己创建一个请求上下文类型
MyContext额外实现了一个Hello方法,然后使用eudore.RegisterHandlerExtend注册一个转换函数,转换函数要求参数是一个函数,返回参数是一个eudore.HandlerFunc。
闭包一个func(fn func(MyContext)) eudore.HandlerFunc
转换函数,就将MyContext类型处理函数转换成了eudore.HandlerFunc,然后就可以使用路由注册自己定义的处理函数。
type MyContext eudore.Context
func (ctx MyContext) Hello() {
ctx.WriteString("hellp")
}
func main() {
app := eudore.NewCore()
app.AddHandlerExtend(func(fn func(MyContext)) eudore.HandlerFunc {
return func(ctx eudore.Context) {
fn(MyContext(ctx))
}
})
app.GetFunc("/*", func(ctx MyContext) {
ctx.Hello()
})
}