Maison  >  Article  >  développement back-end  >  Comment pouvez-vous enregistrer et désenregistrer dynamiquement les gestionnaires HTTP dans le package net/http de Go ?

Comment pouvez-vous enregistrer et désenregistrer dynamiquement les gestionnaires HTTP dans le package net/http de Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-05 12:50:02135parcourir

How can you dynamically register and unregister HTTP handlers in Go's net/http package?

Gestion de l'enregistrement et de la désinscription des gestionnaires dynamiques dans net/http

Dans net/http, la gestion des gestionnaires enregistrés au moment de l'exécution nécessite une approche personnalisée. Bien que le serveur HTTP fournisse un mécanisme d'enregistrement des gestionnaires, il n'a pas la possibilité de les désenregistrer dynamiquement.

Implémentation de l'enregistrement des gestionnaires personnalisés

Pour créer et enregistrer des gestionnaires de manière dynamique, vous pouvez utiliser une HandlerFactory personnalisée. Cela peut être conçu pour générer de nouveaux gestionnaires avec des identifiants uniques et les enregistrer à l'aide de http.Handle. Par exemple, un gestionnaire "/create" pourrait générer des instances MyHandler avec des ID croissants et les mapper à des modèles d'URL spécifiques.

<code class="go">type HandlerFactory struct {
    handler_id int
}

func (hf *HandlerFactory) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    hf.handler_id++
    handler := MyHandler{hf.handler_id}
    handle := fmt.Sprintf("/%d/", hf.handler_id)
    http.Handle(handle, &handler)
}</code>

Désinscription des gestionnaires

Pour fournir des gestionnaires non enregistrés, vous aurez besoin pour créer un ServerMux personnalisé qui étend le ServeMux d'origine et inclut une méthode de désenregistrement.

<code class="go">type MyMux struct {
    http.ServeMux
    mu sync.Mutex
}

func (mux *MyMux) Deregister(pattern string) error {
    mux.mu.Lock()
    defer mux.mu.Unlock()
    del(mux.m, pattern)

    // Handle additional error checking or setup here
}</code>

Implémentation d'un serveur Web personnalisable

Pour utiliser ce ServerMux personnalisé, vous pouvez en instancier un nouveau et en envelopper dans un serveur HTTP à l'aide de http.Handler :

<code class="go">mux := new(MyMux)
mux.Handle("/create", &factory)

srv := &http.Server{
    Addr:    "localhost:8080",
    Handler: mux,
}

go srv.ListenAndServe()

// Deregister handlers as needed
mux.Deregister("/123/*")</code>

Cette approche vous permet d'enregistrer et de désenregistrer dynamiquement les gestionnaires, offrant ainsi la flexibilité nécessaire à la gestion des modèles d'URL générés par l'exécution.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn