绕过golang http处理程序
假设我有这样的代码绕过golang http处理程序,http,go,Http,Go,假设我有这样的代码 handler := middleware1.New( middleware2.New( middleware3.New( middleware4.New( NewHandler() ), ), ), ) http.ListenAndServe(":8080", handler) 其中handler拥有大量中间件 现在我想创建自定义端点,它将跳过所
handler := middleware1.New(
middleware2.New(
middleware3.New(
middleware4.New(
NewHandler()
),
),
),
)
http.ListenAndServe(":8080", handler)
其中handler拥有大量中间件
现在我想创建自定义端点,它将跳过所有中间件,因此不会执行serveHTTP()
函数中的任何内容:
http.HandleFunc("/testing", func(
w http.ResponseWriter,
r *http.Request,
) {
fmt.Fprintf(w, "it works!")
return
})
http.ListenAndServe(":8080", handler)
但是这不起作用,/测试
。理想情况下,我根本不想修改处理程序,这可能吗?您可以使用将请求路由到正确的处理程序:
m := http.NewServeMux()
m.HandleFunc("/testing", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "it works!")
return
})
m.Handle("/", handler)
http.ListenAndServe(":8080", m)
使用http.HandleFunc
和http.Handle
函数将使用http.DefaultServerMux
实现相同的结果,在这种情况下,您将把处理程序参数保留为ListenAndServe
作为nil试试看,ListenAndServe处理程序通常为nil
http.Handle("/", handler)
http.HandleFunc("/testing", func(
w http.ResponseWriter,
r *http.Request,
) {
fmt.Fprintf(w, "it works!")
return
})
http.ListenAndServe(":8080", nil)
http.HandleFunc
适用于DefaultServeMux
,而不是您的处理程序。您想将处理程序
添加到ServeMux
还是想将/testing
添加到处理程序
?@JimB将处理程序添加到ServeMux似乎是更好的解决方案,对吗?因为将/testing
添加到handler不会跳过中间件,对吗?是的,如果handler
在中间件之前没有执行任何muxing,那么您需要单独执行此操作--一个ServeMux(或任何muxer/router包)可以为您执行此操作。是的,这正是我要找的,谢谢!