Introduction : Pourquoi Go est-il idéal pour les API REST ?
Go (ou Golang) est un langage de programmation compilé moderne, créé chez Google. Il combine les performances du C++ et la simplicité de Python, ce qui en fait un choix idéal pour créer des services web à forte charge et des API REST. Contrairement à de nombreux autres langages, Go intègre nativement le support du serveur HTTP, du multithreading et une compilation rapide.
Dans ce guide, nous allons créer pas à pas une API REST complète pour gérer une liste de tâches (Todo List). Vous apprendrez à :
- Configurer un serveur HTTP en Go
- Travailler avec des requêtes et réponses JSON
- Implémenter les opérations CRUD (Create, Read, Update, Delete)
- Tester l'API avec curl ou Postman
L'ensemble du processus ne vous prendra pas plus de 30 minutes. C'est parti !
1. Installation et configuration du projet
Avant d'écrire du code, assurez-vous que Go est installé. Vous pouvez le vérifier avec la commande :
go versionSi Go n'est pas installé, téléchargez la dernière version depuis le site officiel.
Créez un nouveau répertoire pour le projet et initialisez le module :
mkdir go-rest-apicd go-rest-apigo mod init go-rest-apiCréez maintenant le fichier main.go — tout notre code y sera. Pour faciliter la gestion des routes, nous utiliserons la bibliothèque standard net/http, déjà intégrée à Go. Aucune dépendance externe n'est nécessaire — c'est l'un des principaux avantages du langage.
2. Définition de la structure de données et du stockage
Commençons par décrire le modèle de données. Pour simplifier, nous stockerons les tâches en mémoire (dans une slice), et non dans une base de données. Créons la structure Task et un compteur d'ID global :
package main
import ( "encoding/json" "log" "net/http" "strconv" "strings" "sync")
// Task représente une tâchetype Task struct { ID int `json:"id"` Title string `json:"title"` Done bool `json:"done"`}
// Stockage des tâches (en mémoire)var ( tasks []Task nextID int = 1 mu sync.Mutex)Notez l'utilisation de sync.Mutex — il est nécessaire pour un accès thread-safe aux données, car le serveur Go peut traiter les requêtes en parallèle.
3. Implémentation des opérations CRUD
Écrivons maintenant les gestionnaires principaux pour chaque méthode HTTP. Nous utiliserons le modèle de routage par URL :
GET /tasks— obtenir toutes les tâchesPOST /tasks— créer une nouvelle tâcheGET /tasks/{id}— obtenir une tâche par son IDPUT /tasks/{id}— mettre à jour une tâcheDELETE /tasks/{id}— supprimer une tâche
3.1. Obtenir toutes les tâches (GET /tasks)
func getTasks(w http.ResponseWriter, r *http.Request) { mu.Lock() defer mu.Unlock()
w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(tasks)}3.2. Créer une tâche (POST /tasks)
func createTask(w http.ResponseWriter, r *http.Request) { var newTask Task if err := json.NewDecoder(r.Body).Decode(&newTask); err != nil { http.Error(w, "Invalid JSON", http.StatusBadRequest) return }
mu.Lock() newTask.ID = nextID nextID++ tasks = append(tasks, newTask) mu.Unlock()
w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newTask)}3.3. Obtenir, mettre à jour et supprimer par ID
Pour ces opérations, nous devons extraire l'ID de l'URL. La bibliothèque standard de Go n'a pas d'analyseur de chemin intégré, nous allons donc écrire un petit utilitaire :