I am using gorilla/mux I have this:
router.HandleFunc("/api/v1/register",h.makeRegisterNewUser(v)).Methods("POST")
and h.makeRegisterNewUser
looks like:
func (h Handler) makeRegisterNewUser(v interface{}) http.HandlerFunc {
type RespBody = ...;
type ReqBody = ...
return func(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&ReqBody)
// ...
json.NewEncoder(w).Encode(RespBody{});
}
}
my question is - is there a way to return multiple http.HandlerFuncs from makeRegisterNewUser? Something like this:
router.HandleFunc("/api/v1/register",h.makeRegisterNewUser(v)).Methods("POST")
func (h Handler) makeRegisterNewUser(v interface{}) (http.HandlerFunc...) {
type RespBody = ...;
type ReqBody = ...
return func(w http.ResponseWriter, r *http.Request) {
// 1
}, func(w http.ResponseWriter, r *http.Request) {
// 2
}, func(w http.ResponseWriter, r *http.Request) {
// 3
}
}
I am not sure if middleware can be chained in Go like it does in Node.js Express.
You can chain multiple http.Handler
using wrapper:
type Middleware struct {
next http.Handler
}
func (m Middleware) Wrap(handler http.Handler) http.Handler {
m.next = handler
return m
}
func (m Middleware) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// run your handler code here
// write error into w and return if you need to interrupt request execution
// call next handler
m.next.ServeHTTP(w, r)
}
Register chained wrappers and main handler:
h1 := Middleware{}
h2 := OtherMiddleware{}
router.Handle("/some_route", h1.Wrap(h2.Wrap(mainHandler))).Methods(http.MethodPost)
Request will execute h1
, h2
and finally mainHandler
.
For example, you can log request in h1
, authorize in h2
and keep business logic in mainHandler
.