我如何编写处理来自 API 的响应/错误的 golang 中间件?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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(ExceptionMessage: "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 事务。因为我到处都在写重复的代码,如果我找到了一种方法来编写一个在处理程序的任何响应后关闭的中间件。我正在寻找错误,因为如果它引发错误,那么我想回滚事务,否则我将在成功时提交它。

以上是关于我如何编写处理来自 API 的响应/错误的 golang 中间件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 RestTemplate 测试 ExceptionHandler

如何在 React js 中以表格格式显示 API 响应?

如何在 Swift 中解析来自 Alamofire API 的 JSON 响应?

编写 Azure Devops / TFS API 脚本时 - 有没有办法在不退出的情况下处理“Get Repo 不存在”错误响应?

如何修复来自 Axios 的随机 http 请求(404 响应)

如何获取返回 Http 状态代码 406 或 400 的 API 的响应 JSON