Modification transparente des requêtes HTTP

GolangGolangBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce projet, vous allez apprendre à implémenter une modification transparente des requêtes HTTP en utilisant l'interface http.RoundTripper de Go. Vous allez créer un transport HTTP personnalisé qui calcule le hachage MD5 du corps de la requête et l'ajoute au header de la requête en tant que champ "X-Md5".

👀 Aperçu

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

🎯 Tâches

Dans ce projet, vous allez apprendre :

  • Comment encapsuler l'interface http.RoundTripper pour effectuer des opérations personnalisées sur les requêtes et les réponses HTTP.
  • Comment calculer le hachage MD5 du corps de la requête et l'ajouter au header de la requête.
  • Comment réinitialiser le corps de la requête après avoir calculé le hachage MD5 pour maintenir l'état d'origine de la requête.

🏆 Réalisations

Après avoir terminé ce projet, vous serez capable de :

  • Comprendre le concept de modification transparente des requêtes HTTP en Go.
  • Implémenter des couches de transport HTTP personnalisées qui peuvent effectuer diverses opérations sur les requêtes et les réponses.
  • Appliquer les connaissances pour améliorer vos propres applications avec des fonctionnalités supplémentaires, telles que l'authentification, la journalisation ou la manipulation des requêtes/réponses.

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/DataTypesandStructuresGroup(["Data Types and Structures"]) go(("Golang")) -.-> go/ObjectOrientedProgrammingGroup(["Object-Oriented Programming"]) go(("Golang")) -.-> go/FileOperationsGroup(["File Operations"]) go(("Golang")) -.-> go/TestingandProfilingGroup(["Testing and Profiling"]) go(("Golang")) -.-> go/CommandLineandEnvironmentGroup(["Command Line and Environment"]) go(("Golang")) -.-> go/NetworkingGroup(["Networking"]) go/DataTypesandStructuresGroup -.-> go/strings("Strings") go/ObjectOrientedProgrammingGroup -.-> go/interfaces("Interfaces") go/FileOperationsGroup -.-> go/reading_files("Reading Files") go/TestingandProfilingGroup -.-> go/testing_and_benchmarking("Testing and Benchmarking") go/CommandLineandEnvironmentGroup -.-> go/command_line("Command Line") go/NetworkingGroup -.-> go/http_client("HTTP Client") go/NetworkingGroup -.-> go/http_server("HTTP Server") go/NetworkingGroup -.-> go/exit("Exit") subgraph Lab Skills go/strings -.-> lab-301260{{"Modification transparente des requêtes HTTP"}} go/interfaces -.-> lab-301260{{"Modification transparente des requêtes HTTP"}} go/reading_files -.-> lab-301260{{"Modification transparente des requêtes HTTP"}} go/testing_and_benchmarking -.-> lab-301260{{"Modification transparente des requêtes HTTP"}} go/command_line -.-> lab-301260{{"Modification transparente des requêtes HTTP"}} go/http_client -.-> lab-301260{{"Modification transparente des requêtes HTTP"}} go/http_server -.-> lab-301260{{"Modification transparente des requêtes HTTP"}} go/exit -.-> lab-301260{{"Modification transparente des requêtes HTTP"}} end

Implémentez le calcul MD5 et la modification du header

Dans cette étape, vous allez apprendre à implémenter une fonction de vérification de données simple qui calcule le MD5 du corps de la requête, le convertit en hexadécimal et l'ajoute au header de la requête avec le nom X-Md5.

  1. Ouvrez le fichier md5_transport.go dans l'éditeur.
  2. Ajoutez le contenu nécessaire à import.
import (
	"bytes"
	"crypto/md5"
	"encoding/hex"
	"io"
	"net/http"
)
  1. Dans la fonction RoundTrip de la structure Transport, ajoutez le code suivant pour calculer le MD5 du corps de la requête et le définir dans le header de la requête :
// Complétez le code
// si le corps de la requête n'est pas nil, calculez le md5 et définissez-le dans le header
if req.Body!= nil {
    body, err := io.ReadAll(req.Body)
    if err!= nil {
        // Si une erreur se produit lors de la lecture du corps, renvoyez la requête d'origine.
        // Ne pas interrompre la requête
        return t.RoundTripper.RoundTrip(req)
    }

    // Calculez le md5
    md5Hash := md5.Sum(body)
    md5HashStr := hex.EncodeToString(md5Hash[:])

    // Définissez le md5 dans le header
    req.Header.Set("X-Md5", md5HashStr)

    // Remettez le corps de la requête à son état initial
    req.Body = io.NopCloser(bytes.NewReader(body))
}

Ce code vérifie d'abord si le corps de la requête n'est pas nil. Si ce n'est pas le cas, il lit tout le corps à l'aide de io.ReadAll, calcule le hachage MD5 à l'aide du package md5 et convertit le hachage en une chaîne hexadécimale. Ensuite, il définit le header "X-Md5" avec la valeur MD5 calculée. Enfin, il remet le corps de la requête à son état initial à l'aide de bytes.NewReader.

  1. Après avoir ajouté le code, enregistrez le fichier md5_transport.go.

Testez l'implémentation

Pour tester l'implémentation, suivez ces étapes :

  1. Ouvrez le terminal dans l'éditeur.

  2. Accédez au répertoire du projet :

    $ cd /home/labex/project
  3. Exécutez les tests :

    $ /usr/local/go/bin/go test

Si le code est correctement implémenté, vous devriez voir la sortie suivante :

PASS
ok      md5transport    0.004s

Cela indique que les tests ont réussi et que votre implémentation du calcul MD5 et de la modification du header fonctionne comme prévu.

Comprendre la modification transparente des requêtes HTTP

En Go, nous effectuons souvent des requêtes réseau à l'aide de http.Client, qui crée internement une http.Request puis utilise http.RoundTripper.RoundTrip pour effectuer la requête réelle. Les opérations de transfert de données réelles sont effectuées à l'intérieur de RoundTrip.

En encapsulant l'interface http.RoundTripper, nous pouvons effectuer diverses opérations sur la requête et la réponse, telles que l'authentification, la statistique, la journalisation d'audit et la modification des requêtes, toutes de manière transparente pour l'utilisateur.

Dans ce défi, nous avons implémenté une fonction de vérification de données simple qui calcule le MD5 du corps de la requête et l'ajoute au header de la requête. Ceci n'est qu'un exemple de la manière dont vous pouvez utiliser l'interface http.RoundTripper pour modifier les requêtes HTTP de manière transparente.

Lorsque vous concevez votre bibliothèque de modules ou utilisez des composants d'autrui, vous pouvez réfléchir à la manière dont vous pouvez utiliser cette technique pour ajouter des fonctionnalités supplémentaires ou modifier le comportement de votre application de manière transparente.

✨ Vérifier la solution et pratiquer

Sommaire

Félicitations ! Vous avez terminé ce projet. Vous pouvez pratiquer plus de laboratoires sur LabEx pour améliorer vos compétences.