iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Go-Gin 多次读取请求正文
  • 693
分享到

Go-Gin 多次读取请求正文

go语言 2024-02-09 09:02:22 693人浏览 独家记忆
摘要

在进行web开发时,处理Http请求是非常常见的任务。对于Go语言开发者来说,Gin框架是一个非常受欢迎的选择。然而,有时候我们需要多次读取请求正文,以进行一些特定的处理。那么,在Go

在进行web开发时,处理Http请求是非常常见的任务。对于Go语言开发者来说,Gin框架是一个非常受欢迎的选择。然而,有时候我们需要多次读取请求正文,以进行一些特定的处理。那么,在Go-Gin中如何实现多次读取请求正文呢?在本文中,PHP小编小新将为大家详细介绍这个问题的解决方案,帮助开发者更好地应对这一需求。

问题内容

我正在尝试在对其数据执行验证后恢复其数据的上下文。我需要数据在下一个函数中根据需要继续移动。

我是 golang 新手,下面的代码是我所能做到的。非常感谢任何帮助和更好的方法。

提前致谢。

验证中间件

func SignupValidator(c *gin.Context) {
    // Read the Body content
    // var bodyBytes []byte
    // if c.Request.Body != nil {
    //  bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
    // }
    var user entity.User
    if err := c.ShouldBindJSON(&user); err != nil {
         validate := validator.New()
         if err := validate.Struct(&user); err != nil {
              c.jsON(http.StatusBadRequest, gin.H{
                 "error": err.Error(),
          })
          c.Abort()
          return
        }
        // c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
    }
    // Read the Body content
    var bodyBytes []byte
    if c.Request.Body != nil {
        bodyBytes, _ = ioutil.ReadAll(c.Request.Body)
    }
    fmt.Println(string(bodyBytes)) // this empty
    c.Next()

}

路线

auth.POST("login", gin.Logger(), validations.SignupValidator, func(ctx *gin.Context) {
            ctx.JSON(200, videoController.Save(ctx))
        })

解决方法

这是一个使用 ShouldBindBodyWith 读取正文两次的示例,检查一下:

package main

import (
    "log"
    "net/http"

    "GitHub.com/gin-gonic/gin"
    "github.com/gin-gonic/gin/binding"
)

type ParamsOne struct {
    Username string `json:"username"`
}

type ParamsTwo struct {
    Username string `json:"username"`
}

func main() {
    r := gin.New()
    r.POST("/", func(c *gin.Context) {
        var f ParamsOne
        // Read ones
        if err := c.ShouldBindBodyWith(&f, binding.JSON); err != nil {
            log.Printf("%+v", err)
        }
        log.Printf("%+v", f)
        var ff ParamsTwo
        
        if err := c.ShouldBindBodyWith(&ff, binding.JSON); err != nil {
            log.Printf("%+v", err)
        }
        log.Printf("%+v", ff)
        c.IndentedJSON(http.StatusOK, f)
    })
    r.Run(":4000")
}

输出:

$example: ./example
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] POST   /                         --> main.main.func1 (1 handlers)
[GIN-debug] Listening and serving HTTP on :4000
2020/07/05 10:47:03 {Username:somename}
2020/07/05 10:47:03 {Username:somename}

以上就是Go-Gin 多次读取请求正文的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: Go-Gin 多次读取请求正文

本文链接: https://www.lsjlt.com/news/562358.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作