我正在尝试编写一个中间件,在其中我将对请求正文进行json模式验证。验证之后,我需要再次使用请求正文。但我不知道如何做到这一点。我提到了this post找到了进入身体的方法。但是一旦请求主体被使用,我需要它在我的下一个函数中可用。
以下是示例代码:
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": "test@test.com",
"password": "123"
}
I am a middleware for json schema validation
body is:
预期输出:
{
"email": "test@test.com",
"password": "123"
}
I am a middleware for json schema validation
body is: {
"email": "test@test.com",
"password": "123"
}
发布于 2017-11-16 03:21:50
Thellimist所说的,但用更多的话说。
你需要“捕捉并恢复”身体。正文是一个缓冲区,这意味着一旦你读了它,它就消失了。所以,如果你捕捉到它并“把它放回去”,你可以再次访问它。
检查这个答案,我想这就是你要找的:https://stackoverflow.com/a/47295689/3521313
发布于 2015-08-15 20:42:31
您可以将req.Body复制到您的中间件中。查看io.TeeReader + bytes.Buffer。
据我所知,你不能直接复制io.Reader,所以你必须在阅读时复制它,然后将复制的一个分配回c.Request.Body
,以便能够在c.Bind
中使用它
我不确定,但也许this可以让事情变得更简单。
https://stackoverflow.com/questions/32008680
复制相似问题