Go : gestion des données et des images JSON dans un formulaire avec Gin
Gin est un framework Web populaire dans Go qui simplifie la gestion des requêtes HTTP. Cet article aborde un problème spécifique lié à l'analyse des données JSON et d'une image à partir d'une requête multipart/form-data à l'aide des mécanismes de liaison de Gin.
Code de gestion des requêtes
La requête La fonction de gestionnaire dans Gin reçoit et gère les requêtes HTTP. Dans ce cas, il s'attend à recevoir une requête en plusieurs parties contenant à la fois des données JSON et un fichier image.
func (h *Handlers) UpdateProfile() gin.HandlerFunc { type request struct { Username string `json:"username" binding:"required,min=4,max=20"` Description string `json:"description" binding:"required,max=100"` } return func(c *gin.Context) { var updateRequest request // Bind JSON data to `updateRequest` struct. if err := c.BindJSON(&updateRequest); err != nil { // Handle error here... return } // Get the image file from the request. avatar, err := c.FormFile("avatar") if err != nil { // Handle error here... return } // Validate file size and content type. if avatar.Size > 3<<20 || !avatar.Header.Get("Content-Type") { // if avatar size more than 3mb // Handle error here... return } // Handle image processing and database operations here... // Save username, description, and image to a database. c.IndentedJSON(http.StatusNoContent, gin.H{"message": "successful update"}) } }
Cas de test
Un test unitaire est inclus pour vérifier la fonctionnalité du gestionnaire. Il configure une requête fictive avec un corps multipart/form-data. La requête contient des données JSON et une image.
func TestUser_UpdateProfile(t *testing.T) { type testCase struct { name string image io.Reader username string description string expectedStatusCode int } // Set up mock request with multipart/form-data body. // ... for _, tc := range testCases { // ... w := httptest.NewRecorder() router.ServeHTTP(w, req) assert.Equal(t, tc.expectedStatusCode, w.Result().StatusCode) } }
Erreur lors du test
Lors du test, une erreur s'est produite en raison d'un caractère non valide dans le corps de la requête. Le message d'erreur était "Erreur n°01 : caractère '-' non valide dans un littéral numérique."
Cause première
La fonction c.BindJSON de Gin est utilisée pour analyser les données JSON. du corps de la demande. Cependant, cela suppose que le corps de la requête commence par un JSON valide. Dans le cas d'une requête multipart/form-data, le corps commence par une limite (--30b24345de...), qui est un caractère invalide pour un littéral JSON.
Solution
Pour résoudre ce problème, nous pouvons utiliser la fonction c.ShouldBind de Gin avec bind.FormMultipart pour nous lier explicitement aux données multipart/form corps. Cela permet à Gin d'analyser correctement à la fois les données JSON et le fichier image.
// Bind JSON data and image file to `updateRequest` struct. if err := c.ShouldBindWith(&updateRequest, binding.FormMultipart); err != nil { // Handle error here... return }
Conclusion
Cet article montre comment gérer simultanément les données JSON et un fichier image. dans une requête multipart/form-data avec Gin. Il souligne l'importance d'utiliser la méthode de liaison correcte (c.ShouldBindWith(..., bind.FormMultipart)) pour éviter les erreurs d'analyse.
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!