Hostinger

Démarrer un serveur web en Go (Golang)

Introduction aux serveurs web en Go

Go (Golang) est un langage rapide et compilé. L’une des forces de Go est la facilité à créer et lancer des serveurs web. Dans cette leçon, vous allez découvrir comment créer votre premier serveur HTTP et gérer différentes routes.

📌 Une route est une partie de l’URL qui permet de gérer des requêtes HTTP spécifiques et d’exécuter une fonction dédiée. Cela permet d’afficher du contenu adapté en fonction du chemin présent dans l’URL.

Routes golang

Serveur HTTP basique

Créer un premier serveur HTTP

Le package net/http est inclus de base dans Go.

Il permet de créer un serveur basique :

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Bienvenue sur mon serveur Go !")
    })

    fmt.Println("Serveur démarré sur le port 8080...")
    http.ListenAndServe(":8080", nil)
}

Ici, on utilise http.HandleFunc("/", ...) pour associer la racine / à un handler anonyme qui répond par Bienvenue sur mon serveur Go !. Ensuite, http.ListenAndServe(":8080", nil) lance le serveur sur le port 8080.

Un handler est une fonction qui traite une requête HTTP et génère une réponse. 😉

Ouvrir la page

Pour vérifier que votre site fonctionne bien en local, ouvrez un navigateur de votre choix (par exemple Google Chrome) et ensuite tapez dans la barre d'adresse : http://localhost:8888/ !

Normalement le message suivant devrait apparaître :

Navigateur wev

Couper le serveur web dans Go

Pour arrêter votre serveur web Go, utilisez simplement la combinaison de touches suivante dans votre terminal :

CTRL + C

Cette combinaison interrompt l’exécution du programme et arrête le serveur immédiatement.

Qu'est-ce que : w http.ResponseWriter et r *http.Request ?

r *http.Request ?

r *http.Request est un pointeur vers la requête HTTP reçue. C’est un objet (struct) qui contient toutes les informations sur la requête entrante.

  • La méthode (GET, POST, etc.) via r.Method
  • L’URL (chemin, query string, etc.) via r.URL
  • Les en-têtes (headers) via r.Header
  • Le corps (body) de la requête (pour POST, PUT, etc.) via r.Body
  • etc...

Pourquoi un pointeur *http.Request ?

La struct http.Request est assez volumineuse : elle contient beaucoup d’informations.

Si on passait r par valeur (sans *), on ferait une copie complète de cette struct, ce qui serait moins efficace.

Avec r *http.Request, vous évitez de copier la requête, et vous pouvez (le cas échéant) modifier certains champs directement.

Nous avons exploré les avantages d’utiliser des pointeurs plutôt que de copier une struct dans la leçon sur les pointeurs.

w http.ResponseWriter ?

http.ResponseWriter est une type interface fourni par le package net/http. Cette interface définit les méthodes pour écrire la réponse HTTP (ex. Write, Header, etc.)

Elle permet donc d'écrire des données vers le client (navigateur, ...) et de définir les en-têtes (headers) et le code de statut HTTP.

Différentes routes pour différentes pages.

Créer plusieurs routes

Pour gérer plusieurs chemins (routes) dans votre serveur web, vous pouvez simplement appeler plusieurs fois la méthode http.HandleFunc, en associant à chaque route une fonction de gestion (handler) différente.

Par exemple, vous pouvez définir un handler pour la page d’accueil, un autre pour la page « À propos », un troisième pour la page « Contact », etc.

package main

import (
    "fmt"
    "net/http"
)

// Handler pour la page d'accueil
func homeHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Bienvenue sur la page d’accueil !")
}

// Handler pour la page "À propos"
func aboutHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Ceci est la page À propos.")
}

// Handler pour la page "Contact"
func contactHandler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Page Contact : envoyez-nous un message !")
}

func main() {
    // Association de la route "/" avec homeHandler
    http.HandleFunc("/", homeHandler)
    // Association de la route "/about" avec aboutHandler
    http.HandleFunc("/about", aboutHandler)
    // Association de la route "/contact" avec contactHandler
    http.HandleFunc("/contact", contactHandler)

    fmt.Println("Serveur démarré sur le port 8080...")
    // Démarre l'écoute sur le port 8080
    http.ListenAndServe(":8080", nil)
}

Lancez le serveur :

go run main.go

Chaque route correspond à une page.

Route : /

Page : accueil

Route : /about

Page : à propos

Route : /contact

Page : contact