Golang - 如何在中间件中重写响应正文?

问题描述 投票:0回答:1

我想使用中间件在响应正文隐藏一些字段。我使用 gin-gonic 包作为路由器处理程序。

这是我构建并尝试过的中间件,

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

func (r toolBodyWriter) Write(b []byte) (int, error) {
    return r.body.Write(b)
}


func AuthMiddleware(c *gin.Context) {

    wb := &toolBodyWriter{
        body:           bytes.NewBufferString(""),
        ResponseWriter: c.Writer,
    }

    c.Writer = wb

    c.Next()

    strHide := "name,password,address"

    if strHide != "" {

        hideFlds := strings.Split(strHide, ",")

        originBytes := wb.body

        var resJSON interface{}

        if err := json.Unmarshal(originBytes.Bytes(), &resJSON); err != nil {
            // Error
            return
        }

        switch resJSON.(type) {
        
        case map[string]interface{}:

            var rawMapRes map[string]json.RawMessage

            resBodyUMerr := json.Unmarshal(originBytes.Bytes(), &rawMapRes)
            if resBodyUMerr != nil {
                // Error
                return
            }

            for _, fldRes := range hideFlds {
                for keyRes, _ := range rawMapRes {
                    if keyRes == fldRes {
                        delete(rawMapRes, keyRes)
                    }
                }
            }

            byteResultRes, _ := json.Marshal(rawMapRes)

            // clear Origin Buffer
            wb.body = &bytes.Buffer{}
            wb.Write(byteResultRes)
            wb.ResponseWriter.Write(byteResultRes)
        }
    }
}

这正在本地主机上运行。但在谷歌云运行中部署后,我得到空的响应正文。如果有人理解并为我的担忧提供解决方案,我真的很感激。 谢谢。

go middleware google-cloud-run go-gin
1个回答
0
投票

已解决:用“else”条件处理。

    wb := &toolBodyWriter{
        body:           bytes.NewBufferString(""),
        ResponseWriter: c.Writer,
    }

    originBytes := wb.body // ADDED

    c.Writer = wb

    c.Next()
if rf.Hide != "" {

// originBytes := wb.body - REMOVED
        
    } else {
        wb.Write(originBytes.Bytes())
        wb.ResponseWriter.Write(originBytes.Bytes())
    }
© www.soinside.com 2019 - 2024. All rights reserved.