>백엔드 개발 >Golang >Go 미들웨어 핸들러에서 HTTP 요청 본문을 어떻게 재사용할 수 있나요?

Go 미들웨어 핸들러에서 HTTP 요청 본문을 어떻게 재사용할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-12-05 11:19:10348검색

How Can I Reuse an HTTP Request Body in Go Middleware Handlers?

Go 미들웨어 핸들러에서 HTTP 요청 본문 재사용

Go의 net/http 패키지에서 미들웨어 핸들러는 수신을 처리하고 수정하는 편리한 방법을 제공합니다. 실제 애플리케이션 코드에서 처리하기 전의 HTTP 요청입니다. 그러나 이전 핸들러가 이미 읽은 요청 본문을 미들웨어 핸들러가 재사용해야 하는 경우 일반적인 문제가 발생합니다.

다음 코드 조각을 고려하세요.

func Registration(w http.ResponseWriter, r *http.Request) {
    b, err := ioutil.ReadAll(r.Body) // if you delete this line, the user will be created
    // ...other code
    // if all good then create new user
    user.Create(w, r)
}

...

func Create(w http.ResponseWriter, r *http.Request) {
    b, err := ioutil.ReadAll(r.Body)
    // ...other code
    // ... there I get the problem with parse JSON from &b
}

이 시나리오에서는 , 등록 핸들러는 요청 본문을 변수 b로 읽고 요청 r을 user.Create 핸들러에 전달합니다. 이 핸들러는 본문을 다시 읽으려고 시도합니다. 그러나 본문이 등록 핸들러에서 이미 사용되었기 때문에 오류가 발생합니다.

이 문제에 대한 해결책은 간단합니다. 요청 본문을 읽은 후 외부 핸들러에서 복원하는 것입니다. 이는 bytes.NewReader() 및 io.NopCloser 함수를 사용하여 달성할 수 있습니다.

func Registration(w http.ResponseWriter, r *http.Request) {
    b, err := io.ReadAll(r.Body)
    // ...other code
    r.Body = io.NopCloser(bytes.NewReader(b))
    user.Create(w, r)
}

bytes.NewReader() 함수는 바이트 슬라이스에서 io.Reader를 생성하고 io.NopCloser는 io를 변환합니다. .Reader는 r.Body에 필요한 io.ReadCloser 유형입니다. 본문을 복원하면 후속 핸들러가 원본 요청 데이터에 액세스할 수 있습니다.

위 내용은 Go 미들웨어 핸들러에서 HTTP 요청 본문을 어떻게 재사용할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.