登录
首页 >  Golang >  Go问答

使用 router.HandleFunc 返回多个中间件函数

来源:stackoverflow

时间:2024-03-09 15:24:30 167浏览 收藏

一分耕耘,一分收获!既然都打开这篇《使用 router.HandleFunc 返回多个中间件函数》,就坚持看下去,学下去吧!本文主要会给大家讲到等等知识点,如果大家对本文有好的建议或者看到有不足之处,非常欢迎大家积极提出!在后续文章我会继续更新Golang相关的内容,希望对大家都有所帮助!

问题内容

我正在使用 gorilla/mux 我有这个:

router.handlefunc("/api/v1/register",h.makeregisternewuser(v)).methods("post")

h.makeregisternewuser 看起来像:

func (h handler) makeregisternewuser(v interface{}) http.handlerfunc {

    type respbody = ...;
    type reqbody = ...


    return func(w http.responsewriter, r *http.request) {

        decoder := json.newdecoder(r.body)
        err := decoder.decode(&reqbody)

        // ...

        json.newencoder(w).encode(respbody{});
    }
}

我的问题是 - 有没有办法从 makeregisternewuser 返回多个 http.handlerfuncs ?像这样的事情:

router.HandleFunc("/api/v1/register",h.makeRegisterNewUser(v)).Methods("POST")

func (h Handler) makeRegisterNewUser(v interface{}) (http.HandlerFunc...) {

    type RespBody = ...;
    type ReqBody = ...


    return func(w http.ResponseWriter, r *http.Request) {
       // 1

    }, func(w http.ResponseWriter, r *http.Request) {
       // 2

    }, func(w http.ResponseWriter, r *http.Request) {
        // 3
    }
}

我不确定中间件是否可以像在 node.js express 中那样在 go 中链接。


解决方案


您可以使用包装器链接多个 http.handler

type middleware struct {
    next          http.handler
}

func (m middleware) wrap(handler http.handler) http.handler {
    m.next = handler
    return m
}

func (m middleware) servehttp(w http.responsewriter, r *http.request) {
    // run your handler code here
    // write error into w and return if you need to interrupt request execution

    // call next handler 
    m.next.servehttp(w, r)
}

注册链式包装器和主处理程序:

h1 := Middleware{}
h2 := OtherMiddleware{}
router.Handle("/some_route", h1.Wrap(h2.Wrap(mainHandler))).Methods(http.MethodPost)

请求将执行 h1h2 和最后 mainhandler

例如,您可以在h1中记录请求,在h2中进行授权,并将业务逻辑保留在mainhandler中。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《使用 router.HandleFunc 返回多个中间件函数》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>