Go의 HTTP 서버에서 다중 WriteHeader 호출 처리
Go의 net/http 패키지에서는 특정 항목에 대해 WriteHeader에 대한 다중 호출을 피하는 것이 중요합니다. 요구. 다음 예에서 설명한 것처럼 기본 핸들러 함수 내에서 고루틴을 호출하면 이 문제가 발생할 수 있습니다.
func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Println(r.URL) go HandleIndex(w, r) }) ... }
익명 핸들러 함수 내에서 URL을 인쇄하고 HandleIndex를 호출하는 고루틴을 시작합니다. . 그러나 이로 인해 콘솔에 "다중 응답.WriteHeader 호출" 오류가 발생합니다.
왜 이런 일이 발생합니까? 기본적으로 Go는 핸들러 함수에서 명시적으로 설정되지 않은 경우 응답 상태를 200(HTTP OK)으로 설정합니다. 이 예에서는 HandleIndex가 별도의 고루틴에 헤더를 설정하더라도 응답에 아무것도 쓰지 않거나 상태를 설정하지 않고 기본 핸들러 함수가 완료됩니다. 이로 인해 Go가 상태를 자동으로 설정하여 여러 헤더 쓰기가 발생합니다.
이 문제를 해결하려면 go HandleIndex에서 go 접두어를 제거하여 기본 핸들러 함수와 동일한 goroutine에서 실행되도록 할 수 있습니다. 또는 HandleIndex에서 메인 핸들러 함수가 반환되기 전에 응답 헤더를 설정할 수 있습니다.
또 다른 옵션은 요청이 메인 핸들러 함수에 도달하기 전에 미들웨어를 사용하여 응답 헤더를 설정하는 것입니다. 이런 방식으로 메인 핸들러 기능은 헤더를 설정할 필요가 없으며 미들웨어는 헤더가 한 번만 설정되도록 보장합니다.
func main() { http.HandleFunc("/", middleware(HandleIndex)) ... } func middleware(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") next(w, r) } }
미들웨어를 사용하면 응답 헤더가 다음과 같이 설정되도록 할 수 있습니다. 요청을 처리하기 전에 설정하여 여러 WriteHeader 호출로 인한 잠재적인 문제를 방지하세요.
위 내용은 Go의 `net/http` 패키지에서 `WriteHeader`와 함께 Goroutine을 사용하면 '다중 응답.WriteHeader 호출'이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!