Go言語でミドルウェアを作成する方法と活用例!初心者でもわかるWebアプリ開発
生徒
「先生、Go言語でWebアプリを作るときに、リクエストを事前に処理したり、ログを残したりする方法はありますか?」
先生
「それにはミドルウェアを使います。ミドルウェアは、Webリクエストの前後で共通処理を追加する仕組みです。」
生徒
「ミドルウェアって具体的にどんな処理ができますか?」
先生
「例えば、アクセスログを記録したり、認証チェックをしたり、リクエストに共通のヘッダーを追加したりできます。」
生徒
「なるほど、具体的な作り方を見せてもらえますか?」
先生
「もちろんです。それでは基本から順番に見ていきましょう!」
1. Go言語のミドルウェアとは?
Go言語におけるミドルウェアとは、HTTPリクエストとレスポンスの間で共通処理を行う関数のことです。標準ライブラリのhttp.Handlerを使って簡単に作ることができます。例えば、すべてのリクエストにログを出力したい場合、ミドルウェアを作ると一箇所で処理をまとめられます。
2. 基本的なミドルウェアの作成方法
ミドルウェアは、http.HandlerFuncを引数に取り、同じ型のhttp.HandlerFuncを返す関数として作成します。これにより、元のハンドラーに前処理や後処理を追加できます。
package main
import (
"fmt"
"net/http"
"time"
)
// ログを出力するミドルウェア
func loggingMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
fmt.Printf("リクエスト: %s %s\n", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
fmt.Printf("処理時間: %v\n", time.Since(start))
}
}
func helloHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "こんにちは、ミドルウェアの世界!")
}
func main() {
http.HandleFunc("/hello", loggingMiddleware(helloHandler))
http.ListenAndServe(":8080", nil)
}
この例では、loggingMiddlewareがリクエスト前にログを出力し、リクエスト処理後に処理時間を表示しています。元のハンドラーhelloHandlerはそのまま使えます。
3. ミドルウェアの活用例
ミドルウェアはログだけでなく、認証やエラーハンドリング、共通ヘッダーの追加など幅広く活用できます。
// 認証チェックミドルウェア
func authMiddleware(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
if token != "secret" {
http.Error(w, "認証エラー", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
}
}
func secretHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "認証に成功しました!")
}
func main() {
http.HandleFunc("/secret", authMiddleware(secretHandler))
http.ListenAndServe(":8080", nil)
}
上の例では、authMiddlewareでAuthorizationヘッダーをチェックし、不正な場合はアクセスを拒否しています。これにより、共通の認証処理を複数のハンドラーに簡単に適用できます。
4. 複数のミドルウェアを組み合わせる方法
複数のミドルウェアを順番に適用したい場合、ミドルウェアを入れ子にすることで簡単に実現できます。
http.HandleFunc("/secure", loggingMiddleware(authMiddleware(secretHandler)))
この場合、リクエストはまずauthMiddlewareで認証をチェックされ、通過した場合にloggingMiddlewareでログが記録され、最後にsecretHandlerが実行されます。順番を変えることで、処理の流れを柔軟に制御できます。
5. まとめ
Go言語のミドルウェアは、Webアプリ開発で非常に役立つ仕組みです。ログ出力、認証チェック、共通ヘッダーの追加など、様々な処理を一箇所で管理できるため、コードの整理と保守性向上に繋がります。サードパーティ製ルーターを使うとさらにミドルウェアの管理がしやすくなり、大規模Webアプリにも対応できます。