Go の HTTP Mux でのハンドラーの動的更新
Web アプリケーションでは、サーバーを再起動せずにルートを変更または置換することが望ましいことがよくあります。 Go の http.NewServeMux や Gorilla の mux.Router にはこれに対する組み込みサポートはありませんが、カスタム構造を使用してこれを実装することは可能です。
カスタム ハンドラー構造
解決策には、ハンドラー関数と Enabled フラグの両方をカプセル化するカスタム ハンドラー構造を作成することが含まれます。
<code class="go">type Handler struct { http.HandlerFunc Enabled bool }</code>
ハンドラー マップ
ハンドラーのマップは、ハンドラーのマップを保存するために使用されます。さまざまなルート パターンに関連付けられたカスタム ハンドラー:
<code class="go">type Handlers map[string]*Handler</code>
HTTP ハンドラー
カスタム HTTP ハンドラーは、指定された URL パスに対してハンドラーが有効かどうかを確認するために実装されています。 :
<code class="go">func (h Handlers) ServeHTTP(w http.ResponseWriter, r *http.Request) { path := r.URL.Path if handler, ok := h[path]; ok && handler.Enabled { handler.ServeHTTP(w, r) } else { http.Error(w, "Not Found", http.StatusNotFound) } }</code>
Mux との統合
カスタム ハンドラーは、HandleFunc メソッドを実装することで http.NewServeMux または mux.Router と統合できます:
<code class="go">func (h Handlers) HandleFunc(mux HasHandleFunc, pattern string, handler http.HandlerFunc) { h[pattern] = &Handler{handler, true} mux.HandleFunc(pattern, h.ServeHTTP) }</code>
例
最初のリクエストの後にハンドラーを動的に無効にする例を次に示します:
<code class="go">package main import ( "fmt" "net/http" ) func main() { mux := http.NewServeMux() handlers := Handlers{} handlers.HandleFunc(mux, "/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, "Welcome!") handlers["/"].Enabled = false }) http.Handle("/", mux) http.ListenAndServe(":9020", nil) }</code>
結論
カスタム ハンドラーを使用すると、サーバーを再起動せずに、Go の HTTP マルチプレクサ内のルートを動的に有効または無効にすることができます。これにより、アプリケーションの動作に対する柔軟性と制御が向上し、開発とメンテナンスのタスクを合理化できます。
以上がサーバーを再起動せずに、Go の HTTP マルチプレクサのハンドラーを動的に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。