Introduction : pourquoi Go est le choix idéal pour une API REST
Go (ou Golang) est un langage de programmation compilé de Google, qui combine les performances du C++ avec la simplicité de Python. Si vous souhaitez créer une API REST rapide, fiable et facile à maintenir, Go est l'un des meilleurs choix. Dans cet article, nous allons écrire en 30 minutes une API REST complète en Go, capable de créer, lire, mettre à jour et supprimer des enregistrements (CRUD). Pas de frameworks complexes — seulement la bibliothèque standard net/http et un peu de code.
À la fin de cet article, vous obtiendrez un serveur HTTP prêt à l'emploi qui répond aux requêtes au format JSON et fonctionne sans dépendances externes. C'est parti !
Étape 1 : Configuration du projet et structure
Pour commencer, assurez-vous d'avoir Go installé (version 1.16+). Créez un nouveau répertoire pour le projet et initialisez le module :
mkdir go-rest-apicd go-rest-apigo mod init go-rest-apiLa structure du projet sera simple — un seul fichier main.go. Nous y placerons tout le code pour ne pas compliquer l'exemple. Dans des projets réels, vous diviserez bien sûr le code en paquets, mais pour l'apprentissage, c'est l'idéal.
Étape 2 : Définir la structure de données et le stockage global
Notre API gérera une liste de livres. Créons une structure Book et une simple slice pour stocker les données en mémoire (au lieu d'une base de données).
package main
import ( "encoding/json" "log" "net/http" "strconv" "strings")
type Book struct { ID int `json:"id"` Title string `json:"title"` Author string `json:"author"` Year int `json:"year"`}
var books []Bookvar nextID int = 1Ici, books est notre « couche de données » temporaire, et nextID est un compteur pour attribuer automatiquement un ID aux nouveaux livres.
Étape 3 : Implémenter les gestionnaires de requêtes HTTP (CRUD)
Maintenant, la partie la plus intéressante — écrivons les fonctions de gestion pour chaque méthode HTTP. Nous utiliserons le routeur standard http.NewServeMux.
3.1. Récupérer tous les livres (GET /books)
func getBooks(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(books)}3.2. Créer un nouveau livre (POST /books)
func createBook(w http.ResponseWriter, r *http.Request) { var newBook Book if err := json.NewDecoder(r.Body).Decode(&newBook); err != nil { http.Error(w, "Invalid JSON", http.StatusBadRequest) return } newBook.ID = nextID nextID++ books = append(books, newBook) w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newBook)}3.3. Récupérer un livre par ID (GET /books/{id})
Dans le ServeMux standard, il n'y a pas de support pour les chemins dynamiques, donc nous allons extraire l'ID de l'URL manuellement.
func getBook(w http.ResponseWriter, r *http.Request) { idStr := strings.TrimPrefix(r.URL.Path, "/books/") id, err := strconv.Atoi(idStr) if err != nil { http.Error(w, "Invalid ID", http.StatusBadRequest) return } for _, book := range books { if book.ID == id { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(book) return } } http.Error(w, "Book not found", http.StatusNotFound)}3.4. Mettre à jour un livre (PUT /books/{id})
func updateBook(w http.ResponseWriter, r *http.Request) { idStr := strings.TrimPrefix(r.URL.Path, "/books/") id, err := strconv.Atoi(idStr) if err != nil { http.Error(w, "Invalid ID", http.StatusBadRequest) return } var updatedBook Book if err := json.NewDecoder(r.Body).Decode(&updatedBook); err != nil { h