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"}) } }
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) } }
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 }
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!