How-To Guides

Construire des API REST évolutives avec Go : Guide du développeur

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 !

Share: