網頁

2022/7/2

Golang Web middleware範例

Go middleware範例。


Go的middleware其實也是handler,但其包裝了真正的處理業務的handler,用以預先對request或事後對response進行額外的處理,通常用在日誌記錄、權限檢查、效能紀錄等。

範例環境:

  • Go 1.18


範例

下面建立一個middleware LoggerHandlerFunc來日誌記錄請求的URL路徑、HTTP Method及開始及結束的時間,接收的參數為http.Handler

這邊LoggerHandlerFunc包裝的是http package預設的http.ServeMuxhttp.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))
    }
}

github


測試

啟動專案並在命令列以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



沒有留言:

張貼留言