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
Libérer: 2024-02-09 09:24:18
avant
1286 Les gens l'ont consulté

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

}
Copier après la connexion

Itinéraire

auth.POST("login", gin.Logger(), validations.SignupValidator, func(ctx *gin.Context) {
            ctx.JSON(200, videoController.Save(ctx))
        })
Copier après la connexion

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")
}
Copier après la connexion

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}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal