> 백엔드 개발 > Golang > Go-Gin 미들웨어에서 요청 본문을 여러 번 읽는 방법은 무엇입니까?

Go-Gin 미들웨어에서 요청 본문을 여러 번 읽는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-15 09:12:14
원래의
865명이 탐색했습니다.

How to Read the Request Body Multiple Times in Go-Gin Middleware?

고진 미들웨어에서 요청 본문을 여러 번 읽기

고진 미들웨어에서 요청 본문 데이터를 검증할 때 몸은 여러 번. 그러나 신체를 읽고 조작하면 예상치 못한 동작이 발생할 수 있습니다. 이 문서에서는 유효성 검사 미들웨어 내에서 요청 본문을 여러 번 읽어 HTTP 요청 주기 전체에서 데이터 무결성을 보장하는 방법에 대한 문제를 다룹니다.

문제:

개발자가 직면한 문제 요청 본문 데이터의 유효성을 검사하고 후속 처리를 위해 유효성이 검사된 정보를 유지해야 하는 상황입니다. 그러나 c.ShouldBindJSON()을 사용하여 본문을 구조체로 읽으면 후속 본문 읽기 시도가 빈 응답을 반환하게 됩니다.

// SignupValidator Middleware
func SignupValidator(c *gin.Context) {
    var user entity.User
    if err := c.ShouldBindJSON(&user); err != nil {
        // Validation logic
    }

    // Subsequent read attempt
    bodyBytes, _ := ioutil.ReadAll(c.Request.Body)
    fmt.Println(string(bodyBytes)) // Empty response
}
로그인 후 복사

해결책:

요청 본문을 보존하고 다중 읽기를 활성화하려면 ByteBody 기술을 사용하는 것이 좋습니다. 여기에는 후속 요청에 영향을 주지 않고 사용할 수 있는 버퍼로 본문을 읽는 작업이 포함됩니다.

// SignupValidator Middleware
func SignupValidator(c *gin.Context) {
    byteBody, _ := ioutil.ReadAll(c.Request.Body)
    c.Request.Body = ioutil.NopCloser(bytes.NewBuffer(byteBody))

    var user entity.User
    if err := c.ShouldBindJSON(&user); err != nil {
        // Validation logic
    }

    c.Next()
}
로그인 후 복사

이 솔루션을 사용하면 byteBody에 본문 데이터가 포함되어 있어 필요에 따라 여러 번 액세스할 수 있습니다. ioutil.NopCloser()에 대한 호출은 기본 버퍼를 닫지 않는 새로운 판독기를 생성하여 부작용 없이 후속 읽기를 허용합니다.

위 내용은 Go-Gin 미들웨어에서 요청 본문을 여러 번 읽는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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