Go
Промежуточное
Поиск…
Вступление
В Go Middleware можно использовать для выполнения кода до и после функции обработчика. Он использует мощность однофункциональных интерфейсов. Может быть введен в любое время без ущерба для другого промежуточного программного обеспечения. Для Ex: ведение журнала аутентификации может быть добавлено на более поздних этапах разработки без нарушения существующего кода.
замечания
Подпись промежуточного программного обеспечения должна быть (http.ResponseWriter, * http.Request), т. Е. Типа http.handlerFunc .
Функция нормального обработчика
func loginHandler(w http.ResponseWriter, r *http.Request) {
// Steps to login
}
func main() {
http.HandleFunc("/login", loginHandler)
http.ListenAndServe(":8080", nil)
}
Среднее программное обеспечение Вычислить время, необходимое для выполнения обработчиком handlerFunc
// logger middlerware that logs time taken to process each request
func Logger(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
startTime := time.Now()
h.ServeHttp(w,r)
endTime := time.Since(startTime)
log.Printf("%s %d %v", r.URL, r.Method, endTime)
})
}
func loginHandler(w http.ResponseWriter, r *http.Request) {
// Steps to login
}
func main() {
http.HandleFunc("/login", Logger(loginHandler))
http.ListenAndServe(":8080", nil)
}
CORE Middleware
func CORS(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
origin := r.Header.Get("Origin")
w.Header().Set("Access-Control-Allow-Origin", origin)
if r.Method == "OPTIONS" {
w.Header().Set("Access-Control-Allow-Credentials", "true")
w.Header().Set("Access-Control-Allow-Methods", "GET,POST")
w.RespWriter.Header().Set("Access-Control-Allow-Headers", "Content-Type, X-CSRF-Token, Authorization")
return
} else {
h.ServeHTTP(w, r)
}
})
}
func main() {
http.HandleFunc("/login", Logger(CORS(loginHandler)))
http.ListenAndServe(":8080", nil)
}
Auth Middleware
func Authenticate(h http.Handler) http.Handler {
return CustomHandlerFunc(func(w *http.ResponseWriter, r *http.Request) {
// extract params from req
// post params | headers etc
if CheckAuth(params) {
log.Println("Auth Pass")
// pass control to next middleware in chain or handler func
h.ServeHTTP(w, r)
} else {
log.Println("Auth Fail")
// Responsd Auth Fail
}
})
}
Обработчик восстановления для предотвращения сбоя сервера
func Recovery(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request){
defer func() {
if err := recover(); err != nil {
// respondInternalServerError
}
}()
h.ServeHTTP(w , r)
})
}
Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow