Golang中为什么handler会被调用两次?
Golang中为什么handler会被调用两次? 当我访问URL时,处理程序被调用了两次。
代码:
package main
import (
"net/http"
)
type CustomHandler int
func (handler CustomHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request){
println("the handler")
}
func main() {
handleallRequests()
//http.ListenAndServe("8081" , nil)
}
func handleallRequests() {
var handler CustomHandler
http.ListenAndServe(":8081", handler)
}
更多关于Golang中为什么handler会被调用两次?的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
如果你使用curl,会发现它实际上只被调用了一次。你的浏览器还会请求favicon.ico,而由于你的处理程序没有正确处理这个请求,它返回了相同的响应(实际上记录了相同的消息)。
在您的代码中,处理程序被调用两次的原因很可能是浏览器自动请求了 favicon.ico 文件。当您访问根路径(如 http://localhost:8081/)时,浏览器通常会发送两个请求:一个用于您访问的路径,另一个用于站点图标。由于您的处理程序对所有路径都响应,因此它会记录两次。
以下是代码示例,演示了如何验证这一点并处理这种情况:
package main
import (
"net/http"
)
type CustomHandler int
func (handler CustomHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
// 打印请求的URL路径
println("the handler called for path:", req.URL.Path)
}
func main() {
handleallRequests()
}
func handleallRequests() {
var handler CustomHandler
http.ListenAndServe(":8081", handler)
}
运行此代码并访问 http://localhost:8081/,您将在控制台看到类似输出:
the handler called for path: /
the handler called for path: /favicon.ico
这表明处理程序被调用了两次:一次针对根路径 /,另一次针对 /favicon.ico。如果这不是期望的行为,您可以在处理程序中添加路径检查:
func (handler CustomHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
if req.URL.Path == "/favicon.ico" {
// 返回404或空响应以避免处理
rw.WriteHeader(http.StatusNotFound)
return
}
println("the handler called for path:", req.URL.Path)
}
这样,/favicon.ico 的请求将被忽略,处理程序仅对根路径记录一次。

