>백엔드 개발 >Golang >Go Chi 미들웨어 핸들러에서 HTTP 요청 본문을 재사용하는 방법은 무엇입니까?

Go Chi 미들웨어 핸들러에서 HTTP 요청 본문을 재사용하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-05 02:58:08688검색

How to Reuse HTTP Request Bodies in Go Chi Middleware Handlers?

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

Go에서 go-chi 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
}

등록 핸들러는 요청 본문을 읽고 처리하려고 시도합니다. 그러나 이 단계 후에 Create 핸들러가 호출되면 요청 본문이 비어 있기 때문에 요청 본문에서 JSON을 구문 분석하지 못합니다. 이는 외부 핸들러가 요청 본문을 끝까지 읽고 내부 핸들러가 읽을 내용을 남기지 않기 때문에 발생합니다.

이 문제를 해결하려면 외부 핸들러에서 이전에 읽은 데이터를 복원하여 요청 본문을 복원해야 합니다. . 다음 코드 조각은 이를 달성하는 방법을 보여줍니다.

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 Chi 미들웨어 핸들러에서 HTTP 요청 본문을 재사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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