miyazi888の覚え書き日記

学習したことを書き留めてます。

GoのAPIサーバーでmiddlewareを適用する時にaliceを使って楽をする

GoでAPIサーバを作っている時にmiddlewareを適用することはよくあると思うのですが、数が多いと下のようにゴテゴテした感じになると思います。

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/handler1", handler1)
    handler := middle1(middle2(mux))
    log.Fatal(http.ListenAndServe(":8080", handler))
}

この例ではmiddlewareが2つだけなんでこれで済んでますが、増えてくるとゴテゴテ度は増大していくと思います。

この部分、なんかいい方法ないか、探していたらやっぱりありました。

github.com

早速、試してみました。

インストール

go get github.com/justinas/alice

aliceを使ったサンプル

alice.New(の部分がそうでこういう風に手軽にmiddlewareを適用できるようになる。

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/handler1", handler1)
    handler := alice.New(middle1, middle2).Then(mux)
    log.Fatal(http.ListenAndServe(":8080", handler))
}

func middle1(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("middle1 start")
        next.ServeHTTP(w, r)
        fmt.Println("middle1 end")
    })
}

func middle2(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        fmt.Println("middle2 start")
        next.ServeHTTP(w, r)
        fmt.Println("middle2 end")
    })
}

実行結果

上記のサーバを起動して、別ターミナルから以下のようにリクエストを飛ばす。

 curl http://localhost:8080/handler1

サーバ側のログに以下のように表示され、無事middlewareが適用されていることが確認できる。 便利。

middle1 start
middle2 start
middle2 end
middle1 end