【问题标题】:HandleFunc being called twiceHandleFunc 被调用两次
【发布时间】:2016-01-30 15:43:07
【问题描述】:

我在 Go 中关注 simple web server example

我插入了log 语句,结果代码如下所示:

package main

import (
    "io"
    "log"
    "net/http"
)

func hello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello world!")
    log.Println("hello.")
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/", hello)
    http.ListenAndServe(":8000", mux)
}

问题是每当我在我的网络浏览器中加载端口 8000 时,这个函数都会被调用两次。这是一个问题,因为我打算在每次页面访问时增加一个计数器。通过这种行为,计数器会增加两次。 OTOH,如果我这样做curl localhost:8000,它只会被调用一次。

我觉得我在这里错过了一些非常愚蠢的事情。

【问题讨论】:

    标签: go


    【解决方案1】:

    只需记录请求。你会发现你的浏览器也请求 /favicon.ico。

    更多信息请参见https://en.wikipedia.org/wiki/Favicon

    【讨论】:

      【解决方案2】:

      如果您从服务请求很好,但如果您从浏览器进行测试而不是生产意图,您可以在 golang 代码中执行此操作以避免浏览器加载 favicon:

      http.HandleFunc("/favicon.ico", doNothing)
      

      还有功能

      func doNothing(w http.ResponseWriter, r *http.Request){}
      

      对于投反对票的人:这行得通,抱歉在不需要 favicon 或其他任何内容的 api 中使用此代码处理它...

      【讨论】:

        【解决方案3】:

        正如 Didier 所说,是您的浏览器尝试加载网站图标。您可以通过将此代码添加到

        : 来防止这种情况发生
        <link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgo=">
        

        【讨论】:

          【解决方案4】:

          在 Didier Spezia 所说的基础上, "/" 是子树路径的一个示例(因为它以结尾 削减)。另一个例子是"/static/"。子树路径模式是 每当请求 URL 路径开始时匹配(并调用相应的处理程序) 匹配子树路径。如果它有助于您的理解,您可以将子树路径视为 表现得有点像他们最后有一个通配符,比如"/**""/static/**" . 这有助于解释为什么"/" 模式充当包罗万象的角色。模式本质上 表示匹配单个斜杠,后跟任何内容(或根本不匹配)。

          为了防止这种情况发生, 只需像这样在你的 hello 处理程序中添加一个检查

          func hello(w http.ResponseWriter, r *http.Request) {
              if r.URL.Path != "/" {
                  http.NotFound(w, r)
                  return
              }
              io.WriteString(w, "Hello world!")
              log.Println("hello.")
          }
          

          【讨论】:

            猜你喜欢
            • 2016-04-01
            • 2012-05-05
            • 2017-01-19
            • 2014-02-04
            • 2016-12-13
            • 2015-12-20
            • 2019-04-04
            • 2016-02-25
            • 1970-01-01
            相关资源
            最近更新 更多