Introduction
Go, souvent appelé Golang, est rapidement devenu un choix privilégié pour créer des services backend haute performance. Son modèle de concurrence, son typage statique et sa vitesse d'exécution exceptionnelle en font un candidat idéal pour les architectures de microservices modernes. Bien que des frameworks comme Gin ou Echo offrent une certaine commodité, comprendre comment construire des API REST en utilisant la bibliothèque standard de Go est crucial pour maîtriser les mécanismes sous-jacents du langage. Ce guide vous accompagne dans la création d'une API REST basique et fonctionnelle en utilisant uniquement la bibliothèque standard, fournissant ainsi une base solide avant de passer à des outils tiers.
Mise en place de la structure du projet
Avant d'écrire du code, initialisez votre module Go. Ouvrez votre terminal et exécutez la commande suivante dans le répertoire de votre projet :
go mod init my-rest-api
Cette commande crée un fichier go.mod, qui gère les dépendances de votre projet. Pour ce tutoriel, nous nous fierons uniquement aux packages intégrés de Go net/http et encoding/json.
Définition des structures de données
Commençons par définir une ressource simple : une « Tâche ». Nous utiliserons une structure (struct) pour représenter ces données. Les balises `json` sont essentielles pour le sérialisation (marshaling) et la désérialisation (unmarshaling) des données JSON vers et depuis les requêtes et réponses HTTP.
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
)
type Task struct {
ID string `json:"id"`
Title string `json:"title"`
Done bool `json:"done"`
}
Implémentation des handlers HTTP
Le package net/http de Go utilise l'interface HandlerFunc. Un handler est simplement une fonction avec la signature func(http.ResponseWriter, *http.Request). Implémentons un handler pour lister toutes les tâches et un autre pour en créer une nouvelle.
Le handler de liste
Ce handler lit une tranche (slice) globale de tâches et la sérialise dans une réponse JSON. Il est important de définir correctement l'en-tête Content-Type afin que les clients sachent comment interpréter le payload.
var tasks []Task
func listTasks(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(tasks)
}
Le handler de création
Ce handler écoute les requêtes POST. Il décode le corps JSON entrant dans une nouvelle structure Task, l'ajoute à notre tranche et renvoie l'objet créé avec un code d'état 201 Created.
func createTask(w http.ResponseWriter, r *http.Request) {
var newTask Task
// Décode le corps JSON de la requête
err := json.NewDecoder(r.Body).Decode(&newTask)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
// Ajoutez la logique d'ID ici (par exemple, en utilisant le package uuid)
newTask.ID = "1"
tasks = append(tasks, newTask)
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
json.NewEncoder(w).Encode(newTask)
}
Routage et configuration du serveur
Maintenant que nos handlers sont définis, nous devons les mapper à des chemins d'URL spécifiques. Dans Go, nous utilisons http.HandleFunc ou http.NewServeMux pour un routage plus complexe.
func main() {
// Initialise la tranche de tâches
tasks = []Task{
{ID: "1", Title: "Apprendre Go", Done: false},
}
// Enregistre les routes
http.HandleFunc("/tasks", listTasks)
http.HandleFunc("/tasks/create", createTask)
// Démarre le serveur sur le port 8080
log.Println("Démarrage du serveur sur :8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal(err)
}
}
Conclusion
Construire des API REST avec la bibliothèque standard de Go est simple et puissant. En exploitant net/http et encoding/json, vous bénéficiez d'un contrôle fin sur votre serveur sans la surcharge de grands frameworks. Bien que cet exemple soit basique, il démontre des concepts clés tels que le sérialisation JSON, les codes d'état et la gestion des requêtes, qui s'appliquent à toute application web Go. Pour les applications de production, envisagez d'ajouter des middlewares pour la journalisation, l'authentification et CORS, ou passez à un routeur comme Chi ou Gin pour des besoins de routage plus complexes. Bon codage !