Context in HTTP- und Datenbankaufrufen
Context durch die gesamte Aufrufkette weitergeben
Context in HTTP- und Datenbankaufrufen ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
HTTP-Client mit Context
Übergeben Sie einer ausgehenden HTTP-Anfrage mit req.WithContext(ctx) einen Context. Die Anfrage wird abgebrochen, wenn der Context vor dem Eintreffen der Antwort abgebrochen wird.
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
Bevorzugen Sie http.NewRequestWithContext (Go 1.13+) gegenüber dem Erstellen einer Anfrage und anschließendem Aufruf von WithContext – das ist übersichtlicher und vermeidet eine Zwischenallokation.
Eine HTTP-Anfrage abbrechen
Erstellen Sie mit WithCancel einen abbrechbaren Context, übergeben Sie ihn an die Anfrage und rufen Sie cancel auf, sobald Sie fertig sind oder ein Fehler auftritt. Der Client bricht die TCP-Verbindung ab.
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
defer cancel()
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)database/sql mit Context
Alle Methoden von database/sql haben *Context-Varianten: QueryContext, ExecContext und PrepareContext. Diese brechen die Abfrage ab, sobald der Context abgeschlossen ist.
rows, err := db.QueryContext(ctx, "SELECT id FROM users WHERE active = $1", true)
if err != nil { return err }
defer rows.Close()Context vor der Abfrage prüfen
Prüfen Sie den Context, bevor Sie eine lang laufende Abfrage starten, um sofort abzubrechen, wenn die Anfrage bereits abgebrochen wurde.
if err := ctx.Err(); err != nil {
return err // context already done
}
rows, err := db.QueryContext(ctx, ...)Context und Verbindungspooling
Wenn ein Context während einer Abfrage abgebrochen wird, markiert database/sql die Verbindung als fehlerhaft, sofern der Treiber dies unterstützt. Dadurch wird verhindert, dass eine beschädigte Verbindung in den Pool zurückkehrt.
gRPC und Context
gRPC verwendet den Context zur Weitergabe von Deadlines. Der Client setzt eine Deadline im Context; der Server prüft sie bei jedem Empfang aus dem Stream. Metadaten werden ebenfalls über den Context weitergegeben.
resp, err := client.GetUser(ctx, &pb.GetUserRequest{Id: id})Context eingehender Anfragen
Der HTTP-Server hängt über r.Context() jeder eingehenden Anfrage einen Context an. Dieser Context wird abgebrochen, wenn der Client die Verbindung trennt.
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
result, err := db.QueryContext(ctx, query)
}Context in Middleware-Ketten
Middleware reichert den Request-Context mit Deadlines, Authentifizierungsdaten oder Trace-IDs an und übergibt die angereicherte Anfrage anschließend an den nächsten Handler.
Context über Service-Aufrufe weitergeben
In einer Microservices-Architektur sollte die Trace-ID aus dem Context der eingehenden Anfrage in alle ausgehenden HTTP- und RPC-Header eingefügt werden, damit verteiltes Tracing durchgängig funktioniert.
Mit Context testen
Verwenden Sie in Tests context.Background() oder context.WithTimeout, um zu verhindern, dass Goroutinen zwischen Testfällen weiterlaufen.
Kurzer Test
Welche Funktion erstellt eine HTTP-Anfrage mit einem angehängten Context?
Zusammenfassung: Context in HTTP und DB
Wichtige Punkte:
- Verwenden Sie http.NewRequestWithContext für ausgehende HTTP-Aufrufe
- *Context-Methoden von database/sql brechen Abfragen ab, sobald der Context abgeschlossen ist
r.Context()bei eingehenden Anfragen verwenden; der Context wird bei Trennung des Clients abgebrochen- Geben Sie den Context und die Trace-ID an alle nachgelagerten Aufrufe weiter
Häufig gestellte Fragen
Ist die Lektion „Context in HTTP- und Datenbankaufrufen“ kostenlos?
Ja — der vollständige Text von „Context in HTTP- und Datenbankaufrufen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Context in HTTP- und Datenbankaufrufen“?
Context durch die gesamte Aufrufkette weitergeben Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Context in HTTP- und Datenbankaufrufen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Warum context.Context existiert
- WithCancel und WithTimeout
- WithDeadline und WithValue
- Context in HTTP- und Datenbankaufrufen