HTTP сервер: net/http, middleware, роутинг
Вопрос
Как создать HTTP сервер в Go? Что такое middleware и как его реализовать? Какие есть популярные роутеры?
Ответ
Стандартный net/http: - http.HandleFunc для простых случаев - http.Handler интерфейс для сложной логики - ServeMux для роутинга - Middleware как функции высшего порядка Популярные роутеры: - Gorilla Mux - более гибкий роутинг - Gin - быстрый веб-фреймворк - Echo - минималистичный фреймворк
// Middleware
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("%s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})
// Применение middleware
handler := loggingMiddleware(mux)
log.Fatal(http.ListenAndServe(":8080", handler))
}
// Middleware
func loggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
log.Printf("%s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})
// Применение middleware
handler := loggingMiddleware(mux)
log.Fatal(http.ListenAndServe(":8080", handler))
}
Дополнительные вопросы
Как реализовать graceful shutdown? Что такое http.Server и зачем он нужен?