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つだけなんでこれで済んでますが、増えてくるとゴテゴテ度は増大していくと思います。
この部分、なんかいい方法ないか、探していたらやっぱりありました。
早速、試してみました。
インストール
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