gpt4 book ai didi

go - 如何使用 Context.Request.Body 并保留它?

转载 作者:IT王子 更新时间:2023-10-29 01:02:42 24 4
gpt4 key购买 nike

我正在尝试编写一个中间件,我将在其中对请求正文进行 json 模式验证。验证后,我需要再次使用请求体。但我无法弄清楚如何做到这一点。我提到了this post并找到了进入 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": "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"
}

最佳答案

Thellimist 所说的,但用了更多的话。

您需要“捕捉并恢复” body 。Body 是一个缓冲区,这意味着一旦你读取它,它就消失了。因此,如果您捕获它并“放回原处”,您就可以再次访问它。

检查这个答案,我想这就是你要找的: https://stackoverflow.com/a/47295689/3521313

关于go - 如何使用 Context.Request.Body 并保留它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32008680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com