> 백엔드 개발 > Golang > 웹 브라우저를 사용할 때 Go `HandleFunc`가 두 번 호출되는 이유는 무엇입니까?

웹 브라우저를 사용할 때 Go `HandleFunc`가 두 번 호출되는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-15 08:21:18
원래의
247명이 탐색했습니다.

Why is my Go `HandleFunc` called twice when using a web browser?

예기치 않은 HttpHandler 이중 호출: HandleFunc

소개

http.ServeMux 활용 시 Go 웹 서버의 멀티플렉서에서 등록된 핸들러가 관찰되었습니다. 함수(HandleFunc)는 웹 브라우저에서 이루어진 각 요청에 대해 두 번 호출됩니다. 이 동작은 의도한 기능에 어긋납니다.

문제

카운터를 증가시키는 핸들러 함수를 사용하여 기본 웹 서버를 구현하면 카운터가 증가하는 것이 관찰됩니다. 각 브라우저 요청에 대해 두 번. 그런데 컬을 사용하면 예상한 대로 핸들러가 한 번만 호출됩니다.

원인

요청을 로깅한 후 브라우저에서도 다음과 같은 요청을 보내는 것이 분명해졌습니다. /favicon.ico. 이는 일반적으로 브라우저의 주소 표시줄이나 탭에 표시되는 작은 아이콘에 대한 요청입니다. ServeMux 멀티플렉서는 기본적으로 모든 URL과 일치하므로 이 추가 요청에 대해 등록된 핸들러를 호출하여 이중 호출이 발생합니다.

해결책

핸들러가 favicon.ico 요청에 대해 호출되는 경우 두 가지 접근 방식을 사용할 수 있습니다. 고려 사항:

  1. 특정 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 핸들러는 일반 페이지에 대해서만 호출됩니다.

  1. 기본 패턴에 대한 처리기 건너뛰기:

    mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path == "/" {
        hello(w, r)
    }
    })
    로그인 후 복사

이 접근 방식은 다음의 URL.Path를 확인합니다. 요청을 전달하고 경로가 정확히 /인 경우에만 hello 핸들러가 호출되도록 보장합니다.

위 내용은 웹 브라우저를 사용할 때 Go `HandleFunc`가 두 번 호출되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿