Transparente Modifikation von HTTP-Anfragen

GolangBeginner
Jetzt üben

Einführung

In diesem Projekt lernst du, wie du eine transparente Modifikation von HTTP-Anfragen mit der http.RoundTripper-Schnittstelle in Go implementierst. Du wirst einen benutzerdefinierten HTTP-Transport erstellen, der den MD5-Hash des Anforderungskörpers berechnet und ihn als Feld "X-Md5" zum Anforderungsheader hinzufügt.

👀 Vorschau

$ /usr/local/go/bin/go test
PASS
ok      md5transport    0.004s

🎯 Aufgaben

In diesem Projekt wirst du lernen:

  • Wie du die http.RoundTripper-Schnittstelle kapselst, um benutzerdefinierte Operationen auf HTTP-Anfragen und -Antworten durchzuführen.
  • Wie du den MD5-Hash des Anforderungskörpers berechnest und ihn zum Anforderungsheader hinzufügst.
  • Wie du den Anforderungskörper nach der Berechnung des MD5-Hashes zurücksetzt, um den ursprünglichen Anforderungsstatus beizubehalten.

🏆 Errungenschaften

Nach Abschluss dieses Projekts wirst du in der Lage sein:

  • Das Konzept der transparenten Modifikation von HTTP-Anfragen in Go zu verstehen.
  • Benutzerdefinierte HTTP-Transportschichten zu implementieren, die verschiedene Operationen auf Anfragen und Antworten durchführen können.
  • Das Wissen anzuwenden, um deine eigenen Anwendungen um zusätzliche Funktionen wie Authentifizierung, Protokollierung oder Anforderungs-/Antwortmanipulation zu erweitern.

Implementiere die MD5-Berechnung und die Header-Modifikation

In diesem Schritt lernst du, wie du eine einfache Datenverifizierungsfunktion implementierst, die den MD5-Wert des Anforderungskörpers berechnet, ihn in Hexadezimal umwandelt und ihn als X-Md5 zum Anforderungsheader hinzufügt.

  1. Öffne die Datei md5_transport.go im Editor.
  2. Füge den erforderlichen Inhalt zu import hinzu.
import (
 "bytes"
 "crypto/md5"
 "encoding/hex"
 "io"
 "net/http"
)
  1. In der RoundTrip-Funktion der Transport-Struktur füge den folgenden Code hinzu, um den MD5-Wert des Anforderungskörpers zu berechnen und ihn im Anforderungsheader festzulegen:
// Vollständige den Code
// Wenn der Anforderungskörper nicht nil ist, berechne den MD5-Wert und setze ihn im Header
if req.Body!= nil {
    body, err := io.ReadAll(req.Body)
    if err!= nil {
        // Wenn ein Fehler beim Lesen des Körpers auftritt, gebe die ursprüngliche Anfrage zurück.
        // Unterbreche die Anfrage nicht.
        return t.RoundTripper.RoundTrip(req)
    }

    // Berechne den MD5-Wert
    md5Hash := md5.Sum(body)
    md5HashStr := hex.EncodeToString(md5Hash[:])

    // Setze den MD5-Wert im Header
    req.Header.Set("X-Md5", md5HashStr)

    // Setze den Anforderungskörper zurück
    req.Body = io.NopCloser(bytes.NewReader(body))
}

Dieser Code überprüft zunächst, ob der Anforderungskörper nicht nil ist. Wenn dies der Fall ist, liest er den gesamten Körper mit io.ReadAll, berechnet den MD5-Hash mit dem md5-Paket und wandelt den Hash in einen Hexadezimalstring um. Anschließend legt er den Header "X-Md5" mit dem berechneten MD5-Wert fest. Schließlich setzt er den Anforderungskörper mit bytes.NewReader zurück in den ursprünglichen Zustand.

  1. Nachdem du den Code hinzugefügt hast, speichere die Datei md5_transport.go.

Teste die Implementierung

Um die Implementierung zu testen, folge diesen Schritten:

  1. Öffne das Terminal im Editor.

  2. Navigiere zum Projektverzeichnis:

    cd /home/labex/project
    
  3. Führe die Tests aus:

    /usr/local/go/bin/go test
    

Wenn der Code richtig implementiert ist, solltest du die folgende Ausgabe sehen:

PASS
ok      md5transport    0.004s

Dies zeigt an, dass die Tests bestanden wurden und deine Implementierung der MD5-Berechnung und der Header-Modifikation wie erwartet funktioniert.

Verstehen Sie die transparente Modifikation von HTTP-Anfragen

In Go machen wir oft Netzwerkanfragen mit http.Client, das intern eine http.Request erstellt und dann http.RoundTripper.RoundTrip verwendet, um die tatsächliche Anfrage zu senden. Die eigentlichen Datenübertragungsoperationen werden innerhalb von RoundTrip ausgeführt.

Indem wir die http.RoundTripper-Schnittstelle kapseln, können wir verschiedene Operationen auf der Anfrage und der Antwort durchführen, wie z. B. Authentifizierung, Statistik, Protokollierung und Anfragenmodifizierung, alles in einer transparenten Weise für den Benutzer.

In dieser Herausforderung haben wir eine einfache Datenverifizierungsfunktion implementiert, die den MD5-Wert des Anforderungskörpers berechnet und ihn zum Anforderungsheader hinzufügt. Dies ist nur ein Beispiel dafür, wie Sie die http.RoundTripper-Schnittstelle verwenden können, um HTTP-Anfragen transparent zu modifizieren.

Wenn Sie Ihre Modullibrary entwerfen oder jemandes andere Komponenten verwenden, können Sie darüber nachdenken, wie Sie diese Technik nutzen können, um zusätzliche Funktionen hinzuzufügen oder das Verhalten Ihrer Anwendung auf transparente Weise zu ändern.

Zusammenfassung

Herzlichen Glückwunsch! Du hast dieses Projekt abgeschlossen. Du kannst in LabEx weitere Labs absolvieren, um deine Fähigkeiten zu verbessern.

✨ Lösung prüfen und üben✨ Lösung prüfen und üben✨ Lösung prüfen und üben