Go Academy · Leçon

Context dans les appels HTTP et de base de données

Propager le contexte dans toute la chaîne d’appels

Leçon 4 sur 413 étapes

Context dans les appels HTTP et de base de données est une leçon Go Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Go Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Go Academy comprend 4 leçons au total.

Client HTTP avec un contexte

Transmettez un contexte à une requête HTTP sortante avec req.WithContext(ctx). La requête est annulée si le contexte est annulé avant l’arrivée de la réponse.

req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := http.DefaultClient.Do(req)
if err != nil {
    if errors.Is(err, context.DeadlineExceeded) {
        // timeout
    }
}

http.NewRequestWithContext

Préférez http.NewRequestWithContext (Go 1.13+) à la création d’une requête suivie de l’appel à WithContext : le code est plus clair et évite une allocation intermédiaire.

Annuler une requête HTTP

Créez un contexte annulable avec WithCancel, transmettez-le à la requête et appelez cancel une fois l’opération terminée ou lorsqu’une erreur survient. Le client interrompt la connexion TCP.

ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)

database/sql avec un contexte

Toutes les méthodes de database/sql disposent de variantes *Context : QueryContext, ExecContext et PrepareContext. Elles annulent la requête lorsque le contexte est terminé.

rows, err := db.QueryContext(ctx, "SELECT id FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()

Vérifier le contexte avant la requête

Vérifiez le contexte avant de lancer une requête longue afin de l’interrompre immédiatement si la requête est déjà annulée.

if err := ctx.Err(); err != nil {
    return err // context already done
}
rows, err := db.QueryContext(ctx, ...)

Contexte et regroupement des connexions

Lorsqu’un contexte est annulé au cours d’une requête, database/sql marque la connexion comme défectueuse si le pilote le permet, afin d’empêcher le retour d’une connexion contaminée dans le pool.

gRPC et contexte

gRPC utilise le contexte pour propager les échéances. Le client définit une échéance dans le contexte ; le serveur la vérifie à chaque réception sur le flux. Les métadonnées sont également transmises via le contexte.

resp, err := client.GetUser(ctx, &pb.GetUserRequest{Id: id})

Contexte d’une requête entrante

Le serveur HTTP associe un contexte à chaque requête entrante via r.Context(). Ce contexte est annulé lorsque le client se déconnecte.

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    result, err := db.QueryContext(ctx, query)
}

Contexte dans les chaînes d’intergiciels

L’intergiciel enrichit le contexte de la requête avec des échéances, des données d’authentification ou des identifiants de trace, puis transmet la requête enrichie au handler suivant.

Propager le contexte lors des appels de service

Dans une architecture de microservices, l’identifiant de trace du contexte de la requête entrante doit être injecté dans tous les en-têtes HTTP et RPC sortants afin que le traçage distribué fonctionne de bout en bout.

Tester avec un contexte

Dans les tests, utilisez context.Background() ou context.WithTimeout pour éviter que des goroutines ne persistent entre les cas de test.

Vérification rapide

Quelle fonction crée une requête HTTP avec un contexte associé ?

Récapitulatif : contexte dans HTTP et DB

Points essentiels :

  • Utilisez http.NewRequestWithContext pour les appels HTTP sortants
  • Les méthodes *Context de database/sql annulent les requêtes lorsque le contexte est terminé
  • Utilisez r.Context() pour les requêtes entrantes ; il est annulé à la déconnexion du client
  • Propagez le contexte (et l’identifiant de trace) dans tous les appels en aval
Gratuit pour commencer

Apprends Go avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
51
Leçons
203

Questions Fréquemment Posées

La leçon « Context dans les appels HTTP et de base de données » est-elle gratuite ?

Oui — le texte complet de « Context dans les appels HTTP et de base de données » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Go Academy, passe à CoddyKit PRO. Le cours Go Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Context dans les appels HTTP et de base de données » ?

Propager le contexte dans toute la chaîne d’appels Tu pratiques Go Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Go Academy ?

Aucune expérience préalable n'est requise. Go Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Context dans les appels HTTP et de base de données » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Go Academy ?

Oui. Chaque leçon Go Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Pourquoi context.Context existe
  2. WithCancel et WithTimeout
  3. WithDeadline et WithValue
  4. Context dans les appels HTTP et de base de données
← Retour à Go Academy