Go: Mengendalikan Data dan Imej JSON dalam Borang dengan Gin
Gin ialah rangka kerja web popular dalam Go yang memudahkan pengendalian permintaan HTTP. Artikel ini menangani isu khusus dengan menghuraikan kedua-dua data JSON dan imej daripada permintaan berbilang bahagian/data bentuk menggunakan mekanisme pengikatan Gin.
Kod Pengendalian Permintaan
Permintaan fungsi pengendali dalam Gin menerima dan mengendalikan permintaan HTTP. Dalam kes ini, ia menjangka menerima permintaan berbilang bahagian yang mengandungi kedua-dua data JSON dan fail imej.
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"}) } }
Kes Ujian
Ujian unit disertakan untuk mengesahkan fungsi pengendali. Ia menyediakan permintaan olok-olok dengan badan berbilang bahagian/data bentuk. Permintaan mengandungi data JSON dan imej.
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) } }
Ralat Semasa Ujian
Semasa ujian, ralat berlaku disebabkan oleh aksara yang tidak sah dalam badan permintaan. Mesej ralat ialah "Ralat #01: aksara tidak sah '-' dalam literal angka."
Punca Punca
Fungsi c.BindJSON Gin digunakan untuk menghuraikan data JSON daripada badan permintaan. Walau bagaimanapun, ia menganggap bahawa badan permintaan bermula dengan JSON yang sah. Dalam kes permintaan berbilang bahagian/data bentuk, kandungan bermula dengan sempadan (--30b24345de...), yang merupakan aksara tidak sah untuk literal JSON.
Penyelesaian
Untuk menyelesaikan isu ini, kita boleh menggunakan fungsi c.ShouldBind Gin dengan mengikat.FormMultipart untuk secara eksplisit ikat pada badan berbilang bahagian/data bentuk. Ini membolehkan Gin menghuraikan kedua-dua data JSON dan fail imej dengan betul.
// Bind JSON data and image file to `updateRequest` struct. if err := c.ShouldBindWith(&updateRequest, binding.FormMultipart); err != nil { // Handle error here... return }
Kesimpulan
Artikel ini menunjukkan cara mengendalikan data JSON dan fail imej secara serentak dalam permintaan berbilang bahagian/data bentuk dengan Gin. Ia menyerlahkan kepentingan menggunakan kaedah pengikatan yang betul (c.ShouldBindWith(..., binding.FormMultipart)) untuk mengelakkan ralat penghuraian.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Data dan Imej JSON dalam Permintaan Berbilang Bahagian/Data dengan Gin?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!