#buildinpublic #SeniorGo Serveur HTTP en golang à partir de zéro

Golang est livré avec un serveur HTTP robuste, puissant et prêt pour la production. De plus, il est très facile à utiliser et pourtant il reste polyvalent et configurable dans les moindres détails.

Le paquet http contient un objet Server avec tout ce dont nous avons besoin. Le minimum indispensable pour démarrer sont les attributs Addr et Handler.

Addr

Addr est l'adresse sur laquelle il va écouter, c'est une chaîne de caractères de la forme <ip>:<port>. Par exemple, si nous voulons recevoir des requêtes de n'importe quel ordinateur du réseau sur le port 8080, on peut mettre :8080 ou 0.0.0.0:8080. Si nous développions, nous pourrions utiliser 127.0.0.1:8080 pour que seul notre ordinateur puisse y accéder (très utile sur Mac pour éviter que l'avertissement du pare-feu ne s'affiche constamment).

Handler

Handler est une fonction qui sera invoquée chaque fois que le serveur reçoit une requête HTTP. Cette fonction dispose d'un ResponseWriter pour envoyer notre réponse et d'une Request pour lire la requête du client.

Dans l'exemple suivant, nous écrivons un log avec la méthode HTTP et l'URL, puis nous envoyons comme réponse un "Hello World!!".

package main import ( "log" "net/http" ) func main() { s := &http.Server{ Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println(r.Method, r.URL) w.Write([]byte("Hello World!!")) }), } err := s.ListenAndServe() if err != nil { log.Fatal(err) } }

Si au démarrage du serveur tout s'est bien passé, l'exécution s'arrêtera à l'appel de ListenAndServe car il est bloquant, et toutes les requêtes HTTP qui arrivent seront traitées avec la fonction handler que nous avons définie.

Dans cet exemple, nous retournons toujours la même réponse, quelle que soit l'URL reçue.

Servir plus de pages

Pour servir plus de pages, par exemple la page d'accueil et la page de connexion, nous devons ajouter manuellement des conditions.

s := &http.Server{ Addr: ":8080", Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Println(r.Method, r.URL) if r.URL.Path == "/" { w.Write([]byte("<h1>Inicio</h1>")) return } if r.URL.Path == "/login" { w.Write([]byte("<h1>Login</h1>")) return } // ... }), }

De cette façon, nous obtiendrons la page de connexion en accédant à http://localhost:8080/login et la page d'accueil à http://localhost:8080/

Comme vous l'avez peut-être deviné, ce code est fragile et peu maintenable, mais heureusement il existe les routeurs HTTP, également appelés Mux, pour nous faciliter la vie.

Rejoignez-nous !

Suivez le projet sur Discord SeniorGo - Latam.

Rejoignez le projet sur GitHub.

Regardez la vidéo complète sur YouTube.