«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как реализовать поддержку подстановочных знаков в HTTP-маршрутизации Go за пределами http.HandleFunc?

Как реализовать поддержку подстановочных знаков в HTTP-маршрутизации Go за пределами http.HandleFunc?

Опубликовано 22 декабря 2024 г.
Просматривать:765

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

Расширенное сопоставление шаблонов обработчиков с подстановочными знаками с использованием пользовательских обработчиков.

При использовании http.HandleFunc для определения шаблонов маршрутизации в Go встроенные механизмы не предлагайте поддержку подстановочных знаков. Это может быть ограничивающим фактором для захвата компонентов динамического 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))
}

Этот подход позволяет создавать гибкие шаблоны маршрутизации, выходящие за рамки ограничений http.HandleFunc, сохраняя при этом контроль над логикой сопоставления путей в пользовательском обработчике.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3