当前位置: 首页 > 面试题库 >

如何在杜松子酒中记录响应正文

夹谷成仁
2023-03-14
问题内容

我需要将响应主体记录在gin的中间件中,但是我找不到如何获取响应主体。有人可以帮忙吗?

我正在使用这样的中间件:

func Logger() gin.HandlerFunc {

    return func(c *gin.Context) {

        c.Next()

        statusCode := c.Writer.Status()
        if statusCode >= 400 {
            //ok this is an request with error, let's make a record for it
            //log body here
        }
    }
}

我的问题是,如何从中间件中的Context获取响应主体?


问题答案:

您需要拦截响应的编写并将其首先存储在某处。然后您可以记录它。为此,您需要实现自己的Writer来拦截Write()调用

例如,如下:

type bodyLogWriter struct {
    gin.ResponseWriter
    body *bytes.Buffer
}

func (w bodyLogWriter) Write(b []byte) (int, error) {
    w.body.Write(b)
    return w.ResponseWriter.Write(b)
}

func ginBodyLogMiddleware(c *gin.Context) {
    blw := &bodyLogWriter{body: bytes.NewBufferString(""), ResponseWriter: c.Writer}
    c.Writer = blw
    c.Next()
    statusCode := c.Writer.Status()
    if statusCode >= 400 {
        //ok this is an request with error, let's make a record for it
        // now print body (or log in your preferred way)
        fmt.Println("Response body: " + blw.body.String())
    }
}

然后像这样使用这个中间件:

router.Use(ginBodyLogMiddleware)

请注意,该基石不适用于静态文件,因为gin似乎没有为它们使用c.Writer。但是在大多数情况下,这仍然是您想要的。

如果要拦截所有文件,则需要使用稍微复杂一些的方法。代替中间件,您需要实现一个包装器http.Handler,该包装器将包装gin.Engine并将使用与上面所示相同的方法来拦截和记录写入http.ResponseWriter的内容。然后像这样运行gin服务器:

ginRouter := gin.New()
// configure your middleware and routes as required

// Run http server as follows, where bodyLogHandler is your wrapper handler
http.ListenAndServe(bindAddress, &bodyLogHandler{wrappedHandler: ginRouter}


 类似资料:
  • 问题内容: 我是Go和Gin的新手,无法打印出完整的请求正文。 我希望能够从第三方POST读取请求正文,但是我收到的请求正文为空 我的整个代码如下。任何指针表示赞赏! 问题答案: 这里的问题是您要打印出接口类型的字符串值。 您可以做的是让您满意的是,它确实包含所需的主体,它是将值从字符串中读取出来,然后打印出来。 这仅用于您的学习过程! 学习代码: 但是,这不是您应该访问请求正文的方式。让杜松子酒

  • 问题内容: 我在Gin中设置了默认路由器和一些路由: 但是我该如何处理杜松子酒中找不到404路线? 最初,我使用的是了解Gin所用的httprouter,所以这就是我最初拥有的… 和功能: 但这对杜松子酒不起作用。 我需要能够使用返回JSON,这样我才能使用: 问题答案: 您正在寻找的是处理程序。 更确切地说:

  • 问题内容: 我正在使用RestTemplate来调用Web服务。 如果此操作无法返回用户ID,我只会返回null,但不知道为什么。如何将实际的XML响应输出到日志? 问题答案: 根据所使用的建立HTTP连接的方法,您可以查看在实际HTTP连接类中打开日志记录。 例如,如果您使用Commons HttpClient,则可以设置 commons- httpclient项目在其日志记录做法的文档中有一整

  • 问题内容: 如何在Gin Gonic Web Golang框架中将代理路由的一些路径反向请求到另一个后端 是否有一种方法可以直接在Handle函数中进行转发,如下所示? 问题答案: 您可以使用标准库httputil.ReverseProxy进行此操作。 我还没有找到自己使用gin的理由,所以我尽可能地坚持使用stdlib。但是我相信您可以包装此ReverseProxy处理程序,以便能够与您的gin

  • 我是Spring WebClient的新手。有人能建议记录来自另一个WebService的REST请求和响应的最佳方法吗? 我已经看到了一个在问题中记录请求的示例,但也必须记录响应和POST调用的请求。如何记录Spring 5 WebClient调用 谢谢你。

  • 应用程序应异步(在单独的线程中)记录以下信息,而不会影响客户端。 请求HTTP方法和URI 如果我们在过滤器中使用,那么spring将无法再次使用它进行json到对象的映射。在输入流到对象映射期间的某个地方,我们可以插入记录器吗? 更新: 我们可以在MessageConverter中编写日志代码,但这似乎不是一个好主意。