Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
绕过golang http处理程序_Http_Go - Fatal编程技术网

绕过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包)可以为您执行此操作。是的,这正是我要找的,谢谢!