我正在嘗試編寫一箇中間件,我將對請求主體進行json模式驗證。驗證之後,我需要再次使用請求主體。但我無法弄清楚如何做到這一點。我提到了this post 並找到了一種訪問正文的方法。但是一旦使用了請求主體,我就需要將它提供給我的下一個功能。Gin - Go lang如何使用Context.Request.Body並保留它?
下面是示例代碼:
package main
import (
"fmt"
"io/ioutil"
"net/http"
"github.com/gin-gonic/gin"
//"github.com/xeipuuv/gojsonschema"
)
func middleware() gin.HandlerFunc {
return func(c *gin.Context) {
//Will be doing json schema validation here
body := c.Request.Body
x, _ := ioutil.ReadAll(body)
fmt.Printf("%s \n", string(x))
fmt.Println("I am a middleware for json schema validation")
c.Next()
return
}
}
type E struct {
Email string
Password string
}
func test(c *gin.Context) {
//data := &E{}
//c.Bind(data)
//fmt.Println(data) //prints empty as json body is already used
body := c.Request.Body
x, _ := ioutil.ReadAll(body)
fmt.Printf("body is: %s \n", string(x))
c.JSON(http.StatusOK, c)
}
func main() {
router := gin.Default()
router.Use(middleware())
router.POST("/test", test)
//Listen and serve
router.Run("127.0.0.1:8080")
}
電流輸出:
{ 「電子郵件」: 「[email protected]」, 「密碼」: 「123」 } 我我對JSON模式驗證中間件 體是:
預期輸出:
{ 「電子郵件」: 「[email protected]」, 「密碼」: 「123」 } 我爲JSON模式驗證中間件 體是:{ 「電子郵件」:「[email protected] 「, 」password「:」123「 }
https://play.golang.org/p/N_553jVAIX顯示在HTTP複製的'io.ReadCloser'的幾種變化處理程序。需要在身體和預期身材上做些什麼的細節才能在他們之間選擇。 –