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 :
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 }
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 }
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) }
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) }
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) }
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!