【问题标题】:How do i write golang middleware which handle response/error from API?我如何编写处理来自 API 的响应/错误的 golang 中间件?
【发布时间】:2018-10-15 12:19:03
【问题描述】:

基本上,我想编写一个在请求时创建关闭事务对象的中间件。我正在使用 gorilla mux 包。我熟悉 python-Django 中间件,它可以正确处理错误或响应。但找不到与 golang 类似的东西

【问题讨论】:

    标签: go middleware mux


    【解决方案1】:

    在 Go 语言中你也可以创建一个中间件,下面我编写了创建处理程序的过程为validateMiddleware,然后在TestEndpoint API 请求时调用它。

    func main() {
        router := mux.NewRouter()
    
        router.HandleFunc("/test", ValidateMiddleware(TestEndpoint)).Methods("GET")
        log.Fatal(http.ListenAndServe(":12345", router))
    }
    

    现在您可以将validateMiddleware 处理程序创建为:

        func ValidateMiddleware(next http.HandlerFunc) http.HandlerFunc {
            return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
                authorizationHeader := req.Header.Get("authorization")
                        if authorizationHeader != "" {
                            // if true, then request for next handler.
                            next(w, req)
                        } else {
                            json.NewEncoder(w).Encode(Exception{Message: "Invalid authorization token"})
                            return
                        }
            })
        }
    

    最后创建原始请求的处理程序TestEndpoint

    func TestEndpoint(w http.ResponseWriter, req *http.Request) {
        fmt.Println("Hello Go middleware!!!")
    }
    

    【讨论】:

    • 我正在处理程序中启动一个事务,并希望在中间件中关闭它,无论它是从处理程序中抛出错误还是返回响应。
    • 如您在else 部分看到的响应,如果在validateMiddleware 处理程序中授权失败,那么您也可以这样返回。如果您不想在抛出错误后执行进一步的代码,请不要忘记提及 return 关键字。
    • 我认为您共享的代码将在实际处理程序之前调用,但我想以一种在处理程序响应或抛出错误之后调用它的方式编写它。
    • 您想管理代码抛出的错误吗?那你为什么需要middleware?为什么不使用error 处理进程,例如:if err != nil { //something to response }
    • 我想关闭在处理程序中启动的 SQL 事务。因为我到处都在写重复的代码,如果我找到了一种方法来编写一个在处理程序的任何响应后关闭的中间件。我正在寻找错误,因为如果它引发错误,那么我想回滚事务,否则我将在成功时提交它。
    猜你喜欢
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-10-12
    • 2021-11-07
    • 2021-03-30
    • 2021-03-26
    • 2019-04-25
    相关资源
    最近更新 更多