【问题标题】:Golang custom handler for server服务器的 Golang 自定义处理程序
【发布时间】:2017-04-01 07:28:30
【问题描述】:

我想在http.ListenAndServe上使用自定义方法

这就是我所拥有的

http.ListenAndServe(":8000", ErrorHandler)

func ErrorHandler(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        h.ServeHTTP(w, r)
    })
}

错误

cannot use ErrorHandler (type func(http.Handler) http.Handler) as type http.Handler in argument to http.ListenAndServe:
        func(http.Handler) http.Handler does not implement http.Handler (missing ServeHTTP method)

如何向ListenAndServe 添加自定义方法?

【问题讨论】:

  • 您的ErrorHandler 不是http.Handler,它是一个返回处理程序的函数,并将其作为参数,然后您可以将其传递给ListenAndServe。所以这编译了http.ListenAndServe(":8000", ErrorHandler(nil))。大概你将一个实际的处理程序值而不是nil 传递给ErrorHandler 调用,否则h.ServeHTTP 最终会恐慌
  • 我明白了,我想我需要考虑一下:)

标签: http go


【解决方案1】:

您的 ErrorHandler(h http.Handler) http.Handler 函数基本上只是“中间件”,而不是真正的处理程序。它接受一个处理程序h 并返回一个新的处理程序。 http.StripPrefix 就是这种“中间件”的一个例子。

如果您不想要中间件,而只是一个处理程序,那么您需要稍微不同地定义您的函数:

func ErrorHandler(w http.ResponseWriter, r *http.Request) {
    // do stuff with r and w
}

现在您可以将ErrorHandler 传递给ListenAndServe,尽管您仍然需要将其转换为正确的http.Handler 类型,如下所示:

http.ListenAndServe(":8000", http.HandlerFunc(ErrorHandler))

http.HandlerFunc 是一个适配器,它可以将具有正确签名的函数转换为 http.Handler

最后,如果你不喜欢强制转换,你需要定义一个类型而不是一个函数,你需要在该类型上定义一个方法来满足@987654335 @接口类型。

type ErrorHandler struct{}

func (h *ErrorHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    // do stuff with r and w
}

http.ListenAndServe(":8080", &ErrorHandler{})

在此处了解更多信息https://golang.org/pkg/net/http/#Handler

【讨论】:

  • 谢谢。看起来很有希望。我只是给它一个快速的镜头,稍后会深入研究这个。据我所知,这将处理所有请求,而不仅仅是错误请求,对吗?
  • 好吧,既然您将它传递给ListenAndServe,那是正确的。您通常想要做的是实例化 mux 通过路径模式注册您的处理程序,然后将多路复用器传递给 ListenAndServe
  • @xhallix 的快速示例 play.golang.org/p/htxoXo7f8U
猜你喜欢
  • 2018-01-09
  • 2019-03-11
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多