Maison >développement back-end >Golang >Go-Gin lit le corps de la demande plusieurs fois

Go-Gin lit le corps de la demande plusieurs fois

PHPz
PHPzavant
2024-02-09 09:24:181282parcourir

Go-Gin 多次读取请求正文

La gestion des requêtes HTTP est une tâche très courante lors du développement Web. Pour les développeurs du langage Go, le framework Gin est un choix très populaire. Cependant, nous devons parfois lire le corps de la requête plusieurs fois pour effectuer un traitement spécifique. Alors, comment lire le corps de la requête plusieurs fois dans Go-Gin ? Dans cet article, l'éditeur PHP Xiaoxin présentera en détail la solution à ce problème pour aider les développeurs à mieux répondre à cette demande.

Contenu de la question

J'essaie de restaurer le contexte de mes données après avoir effectué une validation dessus. J'ai besoin que les données continuent à se déplacer selon les besoins dans la fonction suivante.

Je suis nouveau sur Golang et le code ci-dessous est ce que je peux faire. Toute aide et meilleure façon serait grandement appréciée.

Merci d'avance.

Middleware d'authentification

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()

}

Itinéraire

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

Solution de contournement

Voici un exemple utilisant ShouldBindBodyWith pour lire le corps deux fois, vérifiez-le :

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")
}

Sortie :

$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}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer