在Go-Gin 中間件中多次讀取請求體
在Go-Gin 中間件中驗證請求體資料時,需要多次訪問身體。然而,解讀和操縱身體可能會導致意想不到的行為。本文解決如何在驗證中間件中多次讀取請求正文的問題,確保整個 HTTP 請求週期中的資料完整性。
問題:
開發者遇到的問題他們需要驗證請求正文資料並保留經過驗證的資訊以供後續處理的情況。但是,使用 c.ShouldBindJSON() 將正文讀取到結構中會導致後續嘗試讀取正文傳回空響應。
// SignupValidator Middleware func SignupValidator(c *gin.Context) { var user entity.User if err := c.ShouldBindJSON(&user); err != nil { // Validation logic } // Subsequent read attempt bodyBytes, _ := ioutil.ReadAll(c.Request.Body) fmt.Println(string(bodyBytes)) // Empty response }
解決方案:
為了保留請求體並啟用多次讀取,建議使用ByteBody技術。這涉及到將正文讀入緩衝區,可以在不影響後續請求的情況下使用該緩衝區。
// SignupValidator Middleware func SignupValidator(c *gin.Context) { byteBody, _ := ioutil.ReadAll(c.Request.Body) c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(byteBody)) var user entity.User if err := c.ShouldBindJSON(&user); err != nil { // Validation logic } c.Next() }
使用此解決方案,byteBody 包含正文數據,可以根據需要多次存取該正文數據。對 ioutil.NopCloser() 的呼叫建立一個新的讀取器,該讀取器不會關閉底層緩衝區,從而允許後續讀取而不會產生副作用。
以上是如何在Go-Gin中間件中多次讀取請求體?的詳細內容。更多資訊請關注PHP中文網其他相關文章!