package main
import (
"log"
"net/http"
"time"
)
// LoggerMiddleware 日志中间件,为处理方法封装一层日志输出
func LoggerMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
log.Printf("Request %s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
log.Printf("Response %s in %v", r.URL.Path, time.Since(start))
})
}
// PanicMiddleware 异常处理中间件,为处理方法封装异常处理逻辑
func PanicMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
defer func() {
e := recover()
if err, ok := e.(error); ok {
log.Println(err)
w.Write([]byte(err.Error()))
} else {
log.Println(e)
w.Write([]byte("unknown error"))
}
}()
next.ServeHTTP(w, r)
})
}
// Hello 一个http.HandlerFunc处理方法,返回hello,world!
func Hello(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("hello,world!\n"))
}
// Panic 一个http.HandlerFunc处理方法,引发一个异常
func Panic(w http.ResponseWriter, req *http.Request) {
panic("oh,we have got a panic!!!")
}
func main() {
// 为/hello路径下的处理方法Hello套上日志输出中间件
http.Handle("/hello", LoggerMiddleware(http.HandlerFunc(Hello)))
// 为/panic路径下的处理方法Panic套上日志输出和异常处理中间件
http.Handle("/panic", PanicMiddleware(LoggerMiddleware(http.HandlerFunc(Panic))))
http.ListenAndServe("localhost:8080", nil)
}