Maison >développement back-end >Golang >Comment gérer les données et les images JSON dans les requêtes Multipart/Form-Data avec Gin ?

Comment gérer les données et les images JSON dans les requêtes Multipart/Form-Data avec Gin ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-01 21:01:11888parcourir

How to Handle JSON Data and Images in Multipart/Form-Data Requests with Gin?

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!

Déclaration:
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