ホームページ  >  記事  >  バックエンド開発  >  Go HTTP ルーティングで「http.HandleFunc」を超えてワイルドカード サポートを実装するにはどうすればよいですか?

Go HTTP ルーティングで「http.HandleFunc」を超えてワイルドカード サポートを実装するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-14 12:17:02605ブラウズ

How to Implement Wildcard Support in Go HTTP Routing Beyond `http.HandleFunc`?

カスタム ハンドラーを使用したワイルドカードによる高度なハンドラー パターン マッチング

Go でルーティング パターンを定義するために http.HandleFunc を使用する場合、組み込みメカニズムワイルドカードのサポートは提供しません。これは、動的 URL コンポーネントをキャプチャする際の制限要因となる可能性があります。

正規表現パターン マッチングを使用したカスタム ハンドラー

この制限を克服するには、次のようなカスタム ハンドラーを作成することが可能です。正規表現を使用した柔軟なパターン マッチングをサポートします。以下に例を示します:

import (
    "net/http"
    "regexp"
)

type route struct {
    pattern *regexp.Regexp
    handler http.Handler
}

type RegexpHandler struct {
    routes []*route
}

// Handler adds a route to the custom handler.
func (h *RegexpHandler) Handler(pattern *regexp.Regexp, handler http.Handler) {
    h.routes = append(h.routes, &route{pattern, handler})
}

// HandleFunc adds a function-based route to the custom handler.
func (h *RegexpHandler) HandleFunc(pattern *regexp.Regexp, handler func(http.ResponseWriter, *http.Request)) {
    h.routes = append(h.routes, &route{pattern, http.HandlerFunc(handler)})
}

// ServeHTTP iterates through registered routes and checks if any pattern matches the request. If a match is found, the corresponding handler is invoked.
func (h *RegexpHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    for _, route := range h.routes {
        if route.pattern.MatchString(r.URL.Path) {
            route.handler.ServeHTTP(w, r)
            return
        }
    }
    // No pattern matched, return a 404 response.
    http.NotFound(w, r)
}

使用法:

ワイルドカード パターンを含む URL を処理するカスタム ハンドラーの使用例:

import (
    "log"
    "net/http"
)

func main() {
    rh := &RegexpHandler{}

    // Define a regular expression for capturing any valid URL string.
    pattern := regexp.MustCompile(`/groups/.*/people`)
    rh.HandleFunc(pattern, peopleInGroupHandler)

    // Start the web server and use the custom handler.
    log.Fatal(http.ListenAndServe(":8080", rh))
}

Thisこのアプローチにより、カスタム ハンドラー内のパス マッチング ロジックの制御を維持しながら、http.HandleFunc の制限を超えた柔軟なルーティング パターンを構築できます。

以上がGo HTTP ルーティングで「http.HandleFunc」を超えてワイルドカード サポートを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。