고진 미들웨어에서 요청 본문을 여러 번 읽기
고진 미들웨어에서 요청 본문 데이터를 검증할 때 몸은 여러 번. 그러나 신체를 읽고 조작하면 예상치 못한 동작이 발생할 수 있습니다. 이 문서에서는 유효성 검사 미들웨어 내에서 요청 본문을 여러 번 읽어 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!