Skip to content

Middleware

go-zero supports middleware at two levels: server-wide and per-route via the API spec.

main.go
func LogMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
log.Printf("-> %s %s", r.Method, r.URL.Path)
next(w, r)
}
}
server := rest.MustNewServer(c.RestConf)
server.Use(LogMiddleware)
@server (
middleware: CheckHeader
)
service user-api {
@handler CreateUser
post /users (CreateUserReq) returns (CreateUserResp)
}

goctl generates a stub in internal/middleware/:

internal/middleware/checkheadermiddleware.go
func (m *CheckHeaderMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("X-App-Version") == "" {
httpx.Error(w, errors.New("missing X-App-Version header"))
return
}
next(w, r)
}
}

Register in ServiceContext:

func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
CheckHeader: middleware.NewCheckHeaderMiddleware().Handle,
}
}
MiddlewarePurpose
RecoverHandlerRecover from panics
PrometheusHandlerPrometheus metrics
TracingHandlerOpenTelemetry tracing
MaxBytesHandlerLimit request body size
TimeoutHandlerPer-request deadline