Go middleware範例。
Go的middleware其實也是handler,但其包裝了真正的處理業務的handler,用以預先對request或事後對response進行額外的處理,通常用在日誌記錄、權限檢查、效能紀錄等。
範例環境:
- Go 1.18
範例
下面建立一個middleware LoggerHandlerFunc
來日誌記錄請求的URL路徑、HTTP Method及開始及結束的時間,接收的參數為http.Handler
。
這邊LoggerHandlerFunc
包裝的是http
package預設的http.ServeMux
即http.DefaultServeMux
,則請求進來時會先通過LoggerHandlerFunc
印出log,接著呼叫h.ServeHttp
進入到請求URL對應pattern的handler,返回時再通過LoggerHandlerFunc
印出log。
main.go
package main
import (
"log"
"net/http"
)
func LoggerHandlerFunc(h http.Handler) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
log.Printf("%s %s start", r.Method, r.URL.Path)
h.ServeHTTP(w, r)
log.Printf("%s %s end", r.Method, r.URL.Path)
}
}
func main() {
http.HandleFunc("/hello", HellohandlerFunc())
http.HandleFunc("/hi", HiHandlerFunc())
handler := LoggerHandlerFunc(http.DefaultServeMux)
http.ListenAndServe(":8080", handler)
}
func HellohandlerFunc() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
data := "hello"
log.Printf("data=%s", data)
w.Write([]byte(data))
}
}
func HiHandlerFunc() http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
data := "hi"
log.Printf("data=%s", data)
w.Write([]byte(data))
}
}
測試
啟動專案並在命令列以curl執行curl -X GET "http://localhost:8080/hello"
返回如下。
$ curl -X GET "http://localhost:8080/hello"
hello
在console印出以下日誌,可以看到先印出LoggerHandlerFunc
的第一行log、接著印出HellohandlerFunc
的log,然後印出LoggerHandlerFunc
最後的log。
2022/07/02 21:10:36 GET /hello start
2022/07/02 21:10:36 data=hello
2022/07/02 21:10:36 GET /hello end
在命令列以curl執行curl -X GET "http://localhost:8080/hi"
返回如下。
$ curl -X GET "http://localhost:8080/hi"
hi
在console印出以下日誌。
2022/07/02 21:11:24 GET /hi start
2022/07/02 21:11:24 data=hi
2022/07/02 21:11:24 GET /hi end
沒有留言:
張貼留言