예기치 않은 HttpHandler 이중 호출: HandleFunc
소개
http.ServeMux 활용 시 Go 웹 서버의 멀티플렉서에서 등록된 핸들러가 관찰되었습니다. 함수(HandleFunc)는 웹 브라우저에서 이루어진 각 요청에 대해 두 번 호출됩니다. 이 동작은 의도한 기능에 어긋납니다.
문제
카운터를 증가시키는 핸들러 함수를 사용하여 기본 웹 서버를 구현하면 카운터가 증가하는 것이 관찰됩니다. 각 브라우저 요청에 대해 두 번. 그런데 컬을 사용하면 예상한 대로 핸들러가 한 번만 호출됩니다.
원인
요청을 로깅한 후 브라우저에서도 다음과 같은 요청을 보내는 것이 분명해졌습니다. /favicon.ico. 이는 일반적으로 브라우저의 주소 표시줄이나 탭에 표시되는 작은 아이콘에 대한 요청입니다. ServeMux 멀티플렉서는 기본적으로 모든 URL과 일치하므로 이 추가 요청에 대해 등록된 핸들러를 호출하여 이중 호출이 발생합니다.
해결책
핸들러가 favicon.ico 요청에 대해 호출되는 경우 두 가지 접근 방식을 사용할 수 있습니다. 고려 사항:
특정 favicon.ico 처리기 추가:
func favicon(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "favicon.ico") } func main() { mux := http.NewServeMux() mux.HandleFunc("/", hello) mux.HandleFunc("/favicon.ico", favicon) http.ListenAndServe(":8000", mux) }
/에 대해 별도의 처리기를 정의하여 favicon.ico, hello 핸들러는 일반 페이지에 대해서만 호출됩니다.
기본 패턴에 대한 처리기 건너뛰기:
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { if r.URL.Path == "/" { hello(w, r) } })
이 접근 방식은 다음의 URL.Path를 확인합니다. 요청을 전달하고 경로가 정확히 /인 경우에만 hello 핸들러가 호출되도록 보장합니다.
위 내용은 웹 브라우저를 사용할 때 Go `HandleFunc`가 두 번 호출되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!