Handler

标准处理函数定义:

// HandlerFunc 是处理一个Context的函数
typeHandlerFunc func(Context)
// HandlerFuncs 是HandlerFunc的集合,表示多个请求处理函数。
type HandlerFuncs []HandlerFunc

其他框架处理函数都是一个固定的函数,而eudore几乎支持任意处理函数,只需要额外注册一下转换函数,将任意对象转换成eudore.HanderFunc对象即可,在基于路由匹配返回字符串的benckmark测试中,处理函数转换造成的性能丢失低于1%。

基于处理函数扩展机制,可以给处理请求的请求上下文添加任意函数。

可以使用eudore.DefaultHandlerExtend.ListExtendHandlerFun()函数查看内置支持的任意函数类型,如果是注册了不支持的处理函数类型会触发panic。

内置扩展处理函数列表,具有参考源码实现:

func NewExtendController(name string, pool ControllerPool, fn func(Context, Controller)) HandlerFunc
func NewExtendControllerFunc(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncContext(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncContextError(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncContextRender(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncContextRenderError(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncError(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncMapString(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncMapStringError(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncMapStringRender(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncMapStringRenderError(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncRender(ef ControllerFuncExtend) HandlerFunc
func NewExtendControllerFuncRenderError(ef ControllerFuncExtend) HandlerFunc
func NewExtendFunc(fn func()) HandlerFunc
func NewExtendFuncContextError(fn func(Context) error) HandlerFunc
func NewExtendFuncContextRender(fn func(Context) interface{}) HandlerFunc
func NewExtendFuncContextRenderError(fn func(Context) (interface{}, error)) HandlerFunc
func NewExtendFuncError(fn func() error) HandlerFunc
func NewExtendFuncNetHTTP1(fn func(http.ResponseWriter, *http.Request)) HandlerFunc
func NewExtendFuncNetHTTP2(fn http.HandlerFunc) HandlerFunc
func NewExtendFuncRPCMap(fn func(Context, map[string]interface{}) (interface{}, error)) HandlerFunc
func NewExtendFuncRender(fn func() interface{}) HandlerFunc
func NewExtendFuncRenderError(fn func() (interface{}, error)) HandlerFunc
func NewExtendFuncString(fn func() string) HandlerFunc
func NewExtendHandlerHTTP(h handlerHTTP) HandlerFunc
func NewExtendHandlerNetHTTP(h http.Handler) HandlerFunc
func NewExtendHandlerRPC(fn interface{}) HandlerFunc
func NewExtendHandlerStringer(fn fmt.Stringer) HandlerFunc

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实现函数扩展基于树路径封装。

// HandlerExtender 定义函数扩展处理者的方法。
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()
    })
}

results matching ""

    No results matching ""