【Golang】gin框架如何在中间件中捕获响应并修改后返回
在Gin框架中,你可以通过自定义中间件来捕获响应并进行修改。以下是一个示例代码,展示了如何在Gin中间件中捕获响应并修改:
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main() {
r := gin.Default()
// 添加自定义中间件
r.Use(ModifyResponseMiddleware())
r.GET("/", func(c *gin.Context) {
c.String(http.StatusOK, "Original response")
})
r.Run()
}
func ModifyResponseMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 在响应写入前,捕获响应内容
origWriter := c.Writer
buf := bytes.NewBufferString("")
multiWriter := io.MultiWriter(buf, origWriter)
c.Writer = &myCustomResponseWriter{
ResponseWriter: origWriter,
body: multiWriter,
}
// 继续处理请求
c.Next()
// 在这里可以修改响应内容
modifiedBody := "Modified response: " + buf.String()
origWriter.Header().Set("Content-Length", strconv.Itoa(len(modifiedBody)))
origWriter.WriteHeader(http.StatusOK)
_, _ = origWriter.Write([]byte(modifiedBody))
}
}
type myCustomResponseWriter struct {
http.ResponseWriter
body io.Writer
}
func (w *myCustomResponseWriter) Write(b []byte) (int, error) {
return w.body.Write(b)
}
在这个示例中,ModifyResponseMiddleware
函数创建了一个自定义的中间件,它捕获原始的响应体,并允许你在响应被写入客户端之前对其进行修改。这里使用了 io.MultiWriter
来同时写入原始响应体和修改后的响应体。
请注意,这只是一个简化的示例,实际应用中可能需要更复杂的逻辑来处理不同的情况,例如状态码、响应头等。
评论已关闭