Le package net/http de Go est vraiment bien fourni et il vous permet de monter un serveur web en très peu de ligne.

Observez le code ci-dessous :

Que s’est-il passé ?

Nous avons spécifié en premier argument de la méthode HandleFunc, une route sur laquelle sera exécuté une fonction déclarée en deuxième argument.

Nous définissons ensuite, la méthode ListenAndServe pour écouter les requêtes HTTP sur le port 8080.

Pour voir le résultat, ouvrez votre navigateur favoris et entrez l’url :
http://localhost:8080/myroute

Nous pourrions aussi utiliser la méthode suivante :

Même si le résultat est le même, la deuxième méthode est un peu différente car nous avons créé un serveur de type Mux pour le donner en deuxième paramètre de la méthode ListenAndServe.

Le deuxième paramètre que doit prendre cette méthode est, si l’on regarde de plus près la documentation officielle, de type Handler. Handler est une simple interface avec comme seul méthode ServeHTTP(ResponseWriter, *Request).

Alors si j’implémente cette interface je pourrais créer un Handler ?

Oui en effet, il suffit pour cela de créer une struct même vide et d’y implémenter l’interface Handler comme ci-dessous :

OK c’est cool tout ça, mais oh fait, à quoi ça sert les Handlers ?

Les handlers servent à manipuler, ajouter des responsabilités au serveur HTTP.

Imaginez, vous pourriez avoir besoin d’une authentification pour accéder de façon sécurisée à votre site, logger les accès à vos pages, et ou changer le Content-type pour une réponse au format JSON. Toutes ces responsabilités pourraient-être ajoutées, cumulées selon vos besoins. Autre avantage, séparer les handlers du serveur HTTP permet de rendre le code réutilisable et de composer à la carte.

Dans l’exemple ci-dessus, nous avons ajouté une fonction nommée SayHelloHandler. Cette fonction est comme un décorateur car, elle prend comme argument une valeur de type Handler et l’exécutera seulement après avoir dit « Hello ».

La puissance des handlers puise sa force d’une simple interface. En regardant de plus près, vous constaterez que la fonction SayHelloHandler, doit aussi retourner une valeur de type Handler.

Ce qui signifie qu’en plus de pouvoir décorer, la fonction SayHelloHandler peut à son tour être décoré. C’est la raison pour laquelle nous utilisons une conversion de type HandlerFunc à la ligne 14.

Si nous avions retourné une simple fonction lambda, elle ne serait pas considéré comme un type Handler mais comme un type func ce qui aurait provoqué une erreur.

À votre tour, ajoutez une fonctionnalité et essayez de créer une nouvelle fonction qui prendrait en argument la fonction SayHelloHandler.

Existe-t-il déjà des handlers prèt à l’emploi ?

Oui, Go fourni quelques Handlers dans son package net/http :

Exemple d’utilisation avec RedirectHandler :

On redirigera l’internaute vers le site golang.org si on demande la route /good2go dans l’url.

Exemple d’utilisation avec StripPrefix et FileServer :

L’utilisation des handlers StripPrefix et FileServer est pratique pour avoir rapidement un serveur de fichier statique comme des images, CSS, Javascript, …

Pour en apprendre plus sur les handlers, je vous propose un tutoriel pour faire un serveur de fichiers statique protéger par une authentification HTTP Basic.

Il n'y a pas de commentaires.