Client HTTP en Go : faire des requêtes correctement

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

Go (Golang) est un langage compilé moderne de Google, idéal pour créer des services réseau à forte charge. Le package intégré net/http fournit un client HTTP puissant et flexible qui permet d'interagir facilement avec les API REST, les serveurs web et d'autres ressources HTTP. Cependant, malgré son apparente simplicité, les débutants commettent souvent des erreurs typiques : oublier de fermer le corps de la réponse, ne pas gérer les timeouts ou ignorer les erreurs.

Dans cet article, nous allons voir comment utiliser correctement le client HTTP en Go. Vous apprendrez à effectuer des requêtes GET et POST, à gérer les en-têtes, à configurer les timeouts et à traiter les erreurs. Tous les exemples de code sont prêts à être utilisés dans vos projets.



1. Bases : requête GET et lecture de la réponse

La façon la plus simple d'effectuer une requête GET est d'utiliser la fonction http.Get(). Cependant, pour le code de production, il est recommandé de créer votre propre instance de http.Client – cela vous donne plus de contrôle sur le comportement du client.



Requête GET simple

package main

import ( "fmt" "io" "net/http" "os")

func main() { // Création du client (avec les paramètres par défaut pour l'instant) client := &http.Client{} // Exécution de la requête GET resp, err := client.Get("https://api.example.com/data") if err != nil { fmt.Fprintf(os.Stderr, "Erreur de requête : %v", err) os.Exit(1) } // IMPORTANT : fermer le corps de la réponse defer resp.Body.Close()

// Lecture du corps de la réponse body, err := io.ReadAll(resp.Body) if err != nil { fmt.Fprintf(os.Stderr, "Erreur de lecture du corps : %v", err) os.Exit(1) }

fmt.Printf("Statut : %s", resp.Status) fmt.Printf("Corps : %s", body)}


Points clés :

  • defer resp.Body.Close() – fermez toujours le corps de la réponse, sinon une fuite de ressources se produira (la connexion ne retournera pas dans le pool).
  • Vérifiez toujours err – le réseau est instable et la requête peut échouer.
  • Vérifiez le statut HTTP de la réponse (resp.StatusCode) pour distinguer le succès (2xx) des erreurs serveur (4xx, 5xx).


2. Requête POST avec corps et en-têtes

Pour envoyer des données au serveur (par exemple, du JSON), on utilise http.Post() ou la méthode plus flexible http.NewRequest() suivie de l'appel à client.Do(). La deuxième méthode est préférable car elle permet de définir les en-têtes et d'autres paramètres.



POST avec données JSON

package main

import ( "bytes" "encoding/json" "fmt" "net/http" "os")

type User struct { Name string `json:"name"` Email string `json:"email"`}

func main() { client := &http.Client{}

// Préparation des données user := User{Name: "Ivan Petrov", Email: "ivan@example.com"} jsonData, err := json.Marshal(user) if err != nil { fmt.Fprintf(os.Stderr, "Erreur de sérialisation JSON : %v", err) os.Exit(1) }

// Création de la requête req, err := http.NewRequest("POST", "https://api.example.com/users", bytes.NewBuffer(jsonData)) if err != nil { fmt.Fprintf(os.Stderr, "Erreur de création de la requête : %v", err) os.Exit(1) }

// Définition des en-têtes req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer YOUR_TOKEN_HERE")

// Envoi de la requête resp, err := client.Do(req) if err != nil { fmt.Fprintf(os.Stderr, "Erreur de requête : %v", err) os.Exit(1) } defer resp.Body.Close()

// Vérification du statut if resp.StatusCode != http.StatusCreated { fmt.Fprintf(os.Stderr, "Le serveur a retourné une erreur : %s", resp.Status) os.Exit(1) }

fmt.Println("Utilisateur créé avec succès !")}


Important

Blogs

Book Recommendations