2 回答
TA贡献1807条经验 获得超9个赞
您需要使用 .将mw.Middleware()语句的第二个参数包装到类型中。http.Handlerhttp.HandlerFunc()
func (h Handler) makeGetMany(v Injection) http.HandlerFunc {
return mw.Middleware(
mw.Allow("admin"),
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Println("now we are sending response.");
json.NewEncoder(w).Encode(v.Share)
}),
)
}
TA贡献1111条经验 获得超0个赞
在 http 包中, ListenAndServe具有以下签名
func ListenAndServe(addr string, handler Handler) error
其中Handler
(ie, http.Handler
) 是一个接口
type Handler interface { ServeHTTP(ResponseWriter, *Request) }
对于一个 Web 应用程序,只有一个ListenAndServe
调用,因此只有一个handler
,它需要处理所有访问点,例如/url1
,/url2
等。如果我们从头开始编写handler
,实现可能是struct
一个围绕数据库句柄的自定义。它的ServeHTTP
方法是检查访问点,然后把相应的内容写入到ResponseWriter
,比较繁琐和杂乱。
这就是ServeMux的动机,它router
在您的代码中。它有一个ServeHTTP方法,因此它满足http.Handler
接口并可用于ListenAndServe
. 此外,它还有HandleFunc
处理个别接入点的方法
func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request))
注意这里handler
不是 a http.Handler
,即它没有ServeHTTP
方法。它不必这样做,因为它mux
已经拥有ServeHTTP
并且它的ServeHTTP
方法可以将各个访问点请求分派给相应的处理程序。
请注意,它还有一个Handle
方法,该方法需要参数满足http.Handler
接口。与方法相比,使用起来稍微不方便HandleFunc
。
func (mux *ServeMux) Handle(pattern string, handler Handler)
现在回到你的问题,因为你打电话router.HandleFunc
,它的输入不一定是http.Handler
。因此,另一种解决方案是用作func(ResponseWriter, *Request)
中间件和makeGetMany
方法的返回类型。(中间件中的类型断言也需要更新,可能还需要更新更多代码)
@xpare 的解决方案是进行类型转换,以便所有函数签名匹配,即转换func(ResponseWriter, *Request)
为http.HandlerFunc
. 看看它是如何工作的也很有趣。
// The HandlerFunc type is an adapter to allow the use of
// ordinary functions as HTTP handlers. If f is a function
// with the appropriate signature, HandlerFunc(f) is a
// Handler that calls f.
type HandlerFunc func(ResponseWriter, *Request)
// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
你可以看到它基本上定义了一个ServeHTTP调用自身的方法。
- 2 回答
- 0 关注
- 114 浏览
添加回答
举报