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
Libérer: 2024-12-01 21:01:11
original
831 Les gens l'ont consulté

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

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

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

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal