Maison > développement back-end > Golang > Golang implémente un framework Web

Golang implémente un framework Web

王林
Libérer: 2023-05-12 22:42:08
original
1003 Les gens l'ont consulté

Golang est un langage de programmation très populaire qui est apprécié par de nombreux programmeurs pour son efficacité et sa puissante prise en charge de la concurrence. Dans le domaine du développement Web, des applications Web hautes performances et hautement évolutives peuvent être créées à l'aide de Golang. Afin de créer des applications Web plus facilement, les développeurs utilisent généralement le framework Web Golang. Dans cet article, nous verrons comment implémenter un framework Web simple à l'aide de Golang.

La mise en œuvre d'un framework Web doit traiter une question très importante : comment gérer les requêtes et les réponses HTTP. Golang fournit une bibliothèque standard très pratique pour gérer ce problème, à savoir le package net/http. Puisque nous souhaitons créer un framework, nous utiliserons cette bibliothèque standard pour implémenter notre application web.

Tout d’abord, nous devons déterminer les fonctionnalités dont notre framework Web a besoin. Nous souhaitons créer un routeur simple capable de mapper le chemin URL demandé par l'utilisateur à la fonction de gestionnaire correspondante. Nous souhaitons également prendre en charge un middleware pour gérer les requêtes et les réponses HTTP.

Avant de créer notre framework Web, nous devons d'abord comprendre certains concepts et bibliothèques Golang courants. Le premier est la structure (struct), qui est un type de données défini par l'utilisateur qui peut être utilisé pour stocker un ensemble d'attributs associés. Vient ensuite la fonction, qui est un bloc de code exécutable qui accepte des paramètres et renvoie une valeur. Dans Golang, les fonctions peuvent également être utilisées comme variables. Enfin, il y a l'interface, qui définit un ensemble de méthodes. Tout type qui implémente ces méthodes peut être considéré comme implémentant l'interface. Les interfaces peuvent être utilisées pour découpler le code et le rendre plus flexible.

Avec ces concepts de base à l'esprit, nous pouvons commencer à construire notre framework Web. La première est la fonction routeur. Nous pouvons implémenter un routeur en créant une structure Router. Cette structure de routeur doit avoir les fonctions suivantes :

  • Être capable de mapper les requêtes aux fonctions de traitement correspondantes en fonction des chemins URL et des méthodes HTTP (GET, POST, etc.).
  • Être capable de gérer les paramètres et les valeurs de retour de la fonction de gestionnaire et de les envelopper dans http.HandlerFunc.
  • Capacité à gérer le middleware du routeur et à l'appliquer aux requêtes et réponses HTTP.

Ce qui suit est une structure de routeur simple qui peut réaliser les fonctions ci-dessus :

type Router struct {
    routes       map[string]map[string]http.HandlerFunc
    middleware   []Middleware
}
Copier après la connexion

Dans cette structure, nous utilisons une carte imbriquée pour stocker le mappage entre les fonctions de routage et de traitement. Nous pouvons facilement implémenter le mappage en ayant des chemins d'URL et des méthodes HTTP comme clés de premier et de deuxième niveau. La propriété middleware est un tableau Middleware qui stocke les middlewares qui s'appliquent aux requêtes et réponses HTTP.

Ensuite, nous devons implémenter une méthode pour ajouter le mappage des fonctions de routage et de traitement :

func (router *Router) HandleFunc(method string, path string, handlerFunc http.HandlerFunc) {
    if _, ok := router.routes[method]; !ok {
        router.routes[method] = make(map[string]http.HandlerFunc)
    }
    router.routes[method][path] = handlerFunc
}
Copier après la connexion

Cette méthode enveloppe la méthode HTTP, le chemin de l'URL et la fonction de traitement dans un type de fonction de traitement et l'ajoute à la table de mappage du routeur. Si aucun mappage n'a été créé pour cette méthode HTTP, nous devons créer une nouvelle entrée dans la table de mappage.

Ensuite, nous devons implémenter une autre méthode pour gérer les requêtes et les réponses HTTP. Cette méthode doit vérifier le chemin d'URL demandé et la méthode HTTP et les mapper à la fonction de gestionnaire correspondante. Si le gestionnaire correspondant n'est pas trouvé, une erreur 404 doit être renvoyée. Si un middleware existe, il doit être géré. Enfin, la fonction de gestionnaire est appelée et la requête et la réponse sont passées en paramètres.

func (router *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var handlerFunc http.HandlerFunc
    var exists bool

    if handlerFunc, exists = router.routes[r.Method][r.URL.Path]; !exists {
        http.NotFound(w, r)
        return
    }

    for _, middleware := range router.middleware {
        handlerFunc = middleware(handlerFunc)
    }

    handlerFunc(w, r)
}
Copier après la connexion

Cette méthode utilise l'interface intégrée http.Handler du langage Go pour gérer les requêtes et les réponses HTTP. La bibliothèque HTTP les convertit automatiquement en http.ResponseWriter et http.Request. Nous devons simplement les gérer comme indiqué dans le code.

Enfin, nous devons implémenter une méthode pour ajouter un middleware. Cette méthode encapsulera davantage la fonction de gestionnaire HTTP et l'appliquera aux requêtes et réponses HTTP.

func (router *Router) Use(middleware Middleware) {
    router.middleware = append(router.middleware, middleware)
}
Copier après la connexion

Maintenant, nous avons créé avec succès un framework Web Golang de base. Le code complet est le suivant :

package main

import (
    "net/http"
)

type Middleware func(http.HandlerFunc) http.HandlerFunc

type Router struct {
    routes       map[string]map[string]http.HandlerFunc
    middleware   []Middleware
}

func NewRouter() *Router {
    return &Router{
        routes: make(map[string]map[string]http.HandlerFunc),
        middleware: []Middleware{},
    }
}

func (router *Router) HandleFunc(method string, path string, handlerFunc http.HandlerFunc) {
    if _, ok := router.routes[method]; !ok {
        router.routes[method] = make(map[string]http.HandlerFunc)
    }
    router.routes[method][path] = handlerFunc
}

func (router *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    var handlerFunc http.HandlerFunc
    var exists bool

    if handlerFunc, exists = router.routes[r.Method][r.URL.Path]; !exists {
        http.NotFound(w, r)
        return
    }

    for _, middleware := range router.middleware {
        handlerFunc = middleware(handlerFunc)
    }

    handlerFunc(w, r)
}

func (router *Router) Use(middleware Middleware) {
    router.middleware = append(router.middleware, middleware)
}

func main() {
    router := NewRouter()

    router.HandleFunc(http.MethodGet, "/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, world!"))
    })

    router.Use(func(next http.HandlerFunc) http.HandlerFunc {
        return func(w http.ResponseWriter, r *http.Request) {
            w.Header().Set("Content-Type", "application/json")
            next(w, r)
        }
    })

    http.ListenAndServe(":8000", router)
}
Copier après la connexion

Dans ce code, nous créons d'abord une fonction appelée NewRouter pour créer une nouvelle instance de Router. Ensuite, nous utilisons la méthode HandleFunc pour ajouter le mappage des fonctions de routage et de traitement correspondantes. Ensuite, ajoutez un middleware via la méthode Use. Enfin, nous utilisons la fonction ListenAndServe pour démarrer le serveur HTTP.

Pour tester notre framework Web, nous pouvons exécuter le code ci-dessus et saisir l'adresse "localhost:8000" dans le navigateur. Si tout se passe bien, vous devriez voir la sortie « Hello, world ! » et l'en-tête de réponse doit contenir l'attribut « Content-Type : application/json ».

Dans cet article, nous présentons comment implémenter un framework Web à l'aide de Golang et démontrons un exemple de code simple. Bien que notre exemple de framework soit très basique, nous pouvons l'étendre en ajoutant plus de fonctionnalités et de middleware. J'espère que vous pourrez apprendre à créer votre propre framework Web dans Golang grâce à cet article.

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal