Go: Gin을 사용하여 양식에서 JSON 데이터 및 이미지 처리
Gin은 HTTP 요청 처리를 단순화하는 Go의 인기 있는 웹 프레임워크입니다. 이 문서에서는 Gin의 바인딩 메커니즘을 사용하여 JSON 데이터와 다중 부분/양식 데이터 요청의 이미지를 모두 구문 분석할 때 발생하는 특정 문제를 다룹니다.
요청 처리 코드
요청 Gin의 핸들러 함수는 HTTP 요청을 수신하고 처리합니다. 이 경우 JSON 데이터와 이미지 파일이 모두 포함된 멀티파트 요청을 수신할 것으로 예상됩니다.
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"}) } }
테스트 사례
검증을 위해 단위 테스트가 포함됩니다. 핸들러의 기능. multipart/form-data 본문을 사용하여 모의 요청을 설정합니다. 요청에 JSON 데이터와 이미지가 포함되어 있습니다.
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) } }
테스트 중 오류
테스트 중 요청 본문에 잘못된 문자가 있어 오류가 발생했습니다. 오류 메시지는 "오류 #01: 숫자 리터럴에 잘못된 문자 '-'가 있습니다."
근본 원인
Gin의 c.BindJSON 함수는 JSON 데이터를 구문 분석하는 데 사용됩니다. 요청 본문에서. 그러나 요청 본문이 유효한 JSON으로 시작한다고 가정합니다. 다중 부분/양식 데이터 요청의 경우 본문은 JSON 리터럴에 유효하지 않은 문자인 경계(--30b24345de...)로 시작합니다.
해결책
이 문제를 해결하려면 Gin의 c.ShouldBind 함수를 바인딩.FormMultipart와 함께 사용하여 명시적으로 바인딩할 수 있습니다. 다중 부분/양식 데이터 본문. 이를 통해 Gin은 JSON 데이터와 이미지 파일을 모두 적절하게 구문 분석할 수 있습니다.
// Bind JSON data and image file to `updateRequest` struct. if err := c.ShouldBindWith(&updateRequest, binding.FormMultipart); err != nil { // Handle error here... return }
결론
이 문서에서는 JSON 데이터와 이미지 파일을 동시에 처리하는 방법을 보여줍니다. Gin을 사용한 multipart/form-data 요청에서. 구문 분석 오류를 방지하려면 올바른 바인딩 방법(c.ShouldBindWith(..., 바인딩.FormMultipart))을 사용하는 것이 중요하다는 점을 강조합니다.
위 내용은 Gin을 사용하여 다중 부분/양식 데이터 요청에서 JSON 데이터 및 이미지를 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!