本书未发布

5.9. Eudore请求处理方法

未匹配的标注

Handler

标准处理函数定义:

type (
    // HandlerFunc 是处理一个Context的函数
    HandlerFunc func(Context)
    // HandlerFuncs 是HandlerFunc的集合,表示多个请求处理函数。
    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实现函数扩展基于树路径封装。

// 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()
    })
}

反馈和交流请加群组:QQ群373278915

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~