我正在设计我的处理程序以返回http.Handler。这是我的处理程序的设计:
func Handler() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
})
}
我的中间件旨在接受http.Handler,然后在中间件完成其操作后调用处理程序。这是我的中间件的设计:
func Middleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Middleware operations
next.ServeHTTP(w, r)
})
}
考虑到我的中间件和处理程序的设计,将信息从中间件传递到处理程序的正确方法是什么?我试图从中间件传递给处理程序的信息是从请求正文解析的JSON Web令牌。如果我没有将解析的JWT传递给处理程序,那么我将需要在我的处理程序中再次解析JWT。在中间件和处理程序中解析JWT的请求主体似乎很浪费。为了防止这些信息相关,我使用带有gorilla mux的标准net / http库。
答案 0 :(得分:7)
(如果您不想更改方法签名,这很好。)
<flow name="test1" doc:name="test1" processingStrategy="synchronous">
<poll frequency="1000" doc:name="Poll">
<set-payload value="Polling started at particular interval !!!" doc:name="Set Payload"/>
</poll>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
</flow>
答案 1 :(得分:6)
类似于问题的第一种方法是codemodus/chain
Daved。{/ p>
包链有助于处理请求范围数据的Handler包装链的组成。
它使用notion of Context
,加上Context处理程序:
func ctxHandler(ctx context.Context, w http.ResponseWriter, r *http.Request) {
// ...
if s, ok := getMyString(ctx); ok {
// s = "Send this down the line."
}
// ...
}
另一种方法:您可以按Custom Handlers and Avoiding Globals in Go Web Applications查看“Matt Silverlock (elithrar
)”。 (full example here)
我们的想法是在包含相关背景的类型上定义ServeHTTP
。
// We've turned our original appHandler into a struct with two fields:
// - A function type similar to our original handler type (but that now takes an *appContext)
// - An embedded field of type *appContext
type appHandler struct {
*appContext
h func(*appContext, http.ResponseWriter, *http.Request) (int, error)
}
// Our ServeHTTP method is mostly the same, and also has the ability to
// access our *appContext's fields (templates, loggers, etc.) as well.
func (ah appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// Updated to pass ah.appContext as a parameter to our handler type.
status, err := ah.h(ah.appContext, w, r)
if err != nil {
log.Printf("HTTP %d: %q", status, err)
switch status {
case http.StatusNotFound:
http.NotFound(w, r)
// And if we wanted a friendlier error page, we can
// now leverage our context instance - e.g.
// err := ah.renderTemplate(w, "http_404.tmpl", nil)
case http.StatusInternalServerError:
http.Error(w, http.StatusText(status), status)
default:
http.Error(w, http.StatusText(status), status)
}
}
}
在appContext
结构中,您可以放置任何想要传递的数据。
答案 2 :(得分:2)