首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用并保留Context.Request.Body?

如何使用并保留Context.Request.Body?
EN

Stack Overflow用户
提问于 2015-08-14 19:11:43
回答 2查看 25.9K关注 0票数 6

我正在尝试编写一个中间件,在其中我将对请求正文进行json模式验证。验证之后,我需要再次使用请求正文。但我不知道如何做到这一点。我提到了this post找到了进入身体的方法。但是一旦请求主体被使用,我需要它在我的下一个函数中可用。

以下是示例代码:

代码语言:javascript
复制
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")
}

当前输出:

代码语言:javascript
复制
{
    "email": "test@test.com",
    "password": "123"
} 

I am a middleware for json schema validation
body is: 

预期输出:

代码语言:javascript
复制
{
    "email": "test@test.com",
    "password": "123"
} 
I am a middleware for json schema validation
body is: {
    "email": "test@test.com",
    "password": "123"
}
EN

回答 2

Stack Overflow用户

发布于 2017-11-16 03:21:50

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

你需要“捕捉并恢复”身体。正文是一个缓冲区,这意味着一旦你读了它,它就消失了。所以,如果你捕捉到它并“把它放回去”,你可以再次访问它。

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

票数 7
EN

Stack Overflow用户

发布于 2015-08-15 20:42:31

您可以将req.Body复制到您的中间件中。查看io.TeeReader + bytes.Buffer

据我所知,你不能直接复制io.Reader,所以你必须在阅读时复制它,然后将复制的一个分配回c.Request.Body,以便能够在c.Bind中使用它

我不确定,但也许this可以让事情变得更简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32008680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档