我想使用中间件在响应正文中隐藏一些字段。我使用 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)
}
}
}
这正在本地主机上运行。但在谷歌云运行中部署后,我得到空的响应正文。如果有人理解并为我的担忧提供解决方案,我真的很感激。 谢谢。
已解决:用“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())
}