> 백엔드 개발 > Golang > Gin을 사용하여 다중 부분/양식 데이터 요청에서 JSON 데이터 및 이미지를 처리하는 방법은 무엇입니까?

Gin을 사용하여 다중 부분/양식 데이터 요청에서 JSON 데이터 및 이미지를 처리하는 방법은 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-01 21:01:11
원래의
831명이 탐색했습니다.

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

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿