Maison >développement back-end >Golang >Go-Gin lit le corps de la demande plusieurs fois
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.
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)) })
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!