Heim > Backend-Entwicklung > Golang > Wie gehe ich mit Gin mit JSON-Daten und -Bildern in Multipart-/Formulardatenanfragen um?

Wie gehe ich mit Gin mit JSON-Daten und -Bildern in Multipart-/Formulardatenanfragen um?

Mary-Kate Olsen
Freigeben: 2024-12-01 21:01:11
Original
830 Leute haben es durchsucht

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

Go: Umgang mit JSON-Daten und Bildern in einem Formular mit Gin

Gin ist ein beliebtes Web-Framework in Go, das die Handhabung von HTTP-Anfragen vereinfacht. Dieser Artikel befasst sich mit einem spezifischen Problem beim Parsen von JSON-Daten und einem Bild aus einer Multipart-/Formulardatenanforderung mithilfe der Bindungsmechanismen von Gin.

Request Handling Code

Die Anfrage Die Handler-Funktion in Gin empfängt und verarbeitet HTTP-Anfragen. In diesem Fall wird der Empfang einer mehrteiligen Anfrage erwartet, die sowohl JSON-Daten als auch eine Bilddatei enthält.

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"})
    }
}
Nach dem Login kopieren

Testfall

Zur Überprüfung ist ein Komponententest enthalten die Funktionalität des Handlers. Es richtet eine Scheinanfrage mit einem mehrteiligen/Formulardatenkörper ein. Die Anfrage enthält JSON-Daten und ein Bild.

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)
    }
}
Nach dem Login kopieren

Fehler beim Test

Während des Tests ist ein Fehler aufgrund eines ungültigen Zeichens im Anfragetext aufgetreten. Die Fehlermeldung lautete „Fehler Nr. 01: ungültiges Zeichen „-“ im numerischen Literal.“

Ursache

Gins c.BindJSON-Funktion wird zum Parsen von JSON-Daten verwendet aus dem Anfragetext. Es wird jedoch davon ausgegangen, dass der Anforderungstext mit gültigem JSON beginnt. Im Fall einer mehrteiligen/Formulardatenanforderung beginnt der Text mit einer Grenze (--30b24345de...), die ein ungültiges Zeichen für ein JSON-Literal ist.

Lösung

Um dieses Problem zu beheben, können wir Gins c.ShouldBind-Funktion mit binding.FormMultipart verwenden, um explizit an den Multipart-/Formulardatenkörper zu binden. Dadurch kann Gin sowohl die JSON-Daten als auch die Bilddatei richtig analysieren.

// Bind JSON data and image file to `updateRequest` struct.
if err := c.ShouldBindWith(&updateRequest, binding.FormMultipart); err != nil {
    // Handle error here...
    return
}
Nach dem Login kopieren

Fazit

Dieser Artikel zeigt, wie man JSON-Daten und eine Bilddatei gleichzeitig verarbeitet in einer Multipart/Form-Data-Anfrage mit Gin. Es unterstreicht, wie wichtig es ist, die richtige Bindungsmethode (c.ShouldBindWith(..., binding.FormMultipart)) zu verwenden, um Analysefehler zu vermeiden.

Das obige ist der detaillierte Inhalt vonWie gehe ich mit Gin mit JSON-Daten und -Bildern in Multipart-/Formulardatenanfragen um?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage