Comment écrire une API REST en Go en 30 minutes : en pratique

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi Go est le choix idéal pour une API REST

Go (Golang) est un langage de programmation compilé, créé chez Google pour les systèmes à forte charge. Il combine la vitesse du C, la simplicité de Python et le support intégré de la concurrence. Pour créer une API REST, Go propose une bibliothèque standard puissante net/http et des frameworks populaires comme gorilla/mux et gin.

Dans ce guide, nous allons créer en 30 minutes une API REST complète pour gérer une liste de tâches (Todo List) en Go pur, sans frameworks tiers. Vous apprendrez à :

  • Configurer le routage et les gestionnaires
  • Travailler avec JSON (sérialisation/désérialisation)
  • Implémenter les opérations CRUD (Create, Read, Update, Delete)
  • Ajouter un middleware pour la journalisation et CORS

Tout le code sera écrit dans un seul fichier main.go pour simplifier. Commençons !



Étape 1 : Structure de base et démarrage du serveur HTTP

Créez un fichier main.go et ajoutez le code suivant. Nous allons déclarer une structure de données pour la tâche et démarrer un serveur simple.

package main

import ( "encoding/json" "log" "net/http" "strconv" "strings" "sync" "time")

// Task — structure de la tâchetype Task struct { ID int `json:"id"` Title string `json:"title"` Completed bool `json:"completed"` CreatedAt time.Time `json:"created_at"`}

// Stockage des tâches (in-memory)var ( tasks = make(map[int]Task) nextID = 1 mu sync.Mutex)

func main() { // Routes http.HandleFunc("/api/tasks", tasksHandler) http.HandleFunc("/api/tasks/", taskByIDHandler)

log.Println("Serveur démarré sur :8080") log.Fatal(http.ListenAndServe(":8080", nil))}

Explication :

  • Task — structure avec des tags JSON pour une sérialisation correcte.
  • tasks — map pour stocker les tâches en mémoire (sans base de données).
  • mu — mutex pour un accès sécurisé depuis les goroutines.
  • Deux routes : /api/tasks (liste et création) et /api/tasks/ (travail sur une tâche par ID).


Étape 2 : Gestionnaires pour la liste des tâches (GET et POST)

Implémentons la fonction tasksHandler qui gère GET (récupération de toutes les tâches) et POST (création d'une nouvelle tâche).

func tasksHandler(w http.ResponseWriter, r *http.Request) {    w.Header().Set("Content-Type", "application/json")

switch r.Method { case http.MethodGet: mu.Lock() taskList := make([]Task, 0, len(tasks)) for _, task := range tasks { taskList = append(taskList, task) } mu.Unlock() json.NewEncoder(w).Encode(taskList)

case http.MethodPost: var newTask Task if err := json.NewDecoder(r.Body).Decode(&newTask); err != nil { http.Error(w, `{"error":"JSON invalide"}`, http.StatusBadRequest) return } mu.Lock() newTask.ID = nextID nextID++ newTask.CreatedAt = time.Now() tasks[newTask.ID] = newTask mu.Unlock()

w.WriteHeader(http.StatusCreated) json.NewEncoder(w).Encode(newTask)

default: http.Error(w, `{"error":"Méthode non supportée"}`, http.StatusMethodNotAllowed) }}

Points clés :

  • Nous utilisons json.NewEncoder et json.NewDecoder pour travailler avec JSON.
  • Pour POST, nous vérifions la validité du JSON, attribuons un ID et retournons 201 Created.
  • Le mutex protège les données lors d'un accès concurrent.


Étape 3 : Gestionnaires pour une tâche individuelle (GET, PUT, DELETE)

Implémentons maintenant taskByIDHandler. Nous extrayons l'ID de l'URL à l'aide de strings.TrimPrefix

Blogs

Book Recommendations