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.RoundTripperpour 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.
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.
- Ouvrez le fichier
md5_transport.godans l'éditeur. - Ajoutez le contenu nécessaire à
import.
import (
"bytes"
"crypto/md5"
"encoding/hex"
"io"
"net/http"
)
- Dans la fonction
RoundTripde la structureTransport, 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.
- Après avoir ajouté le code, enregistrez le fichier
md5_transport.go.
Tester l'implémentation
Pour tester l'implémentation, suivez ces étapes :
Ouvrez le terminal dans l'éditeur.
Accédez au répertoire du projet :
cd /home/labex/projectExé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.
Résumé
Félicitations ! Vous avez terminé ce projet. Vous pouvez pratiquer plus de laboratoires sur LabEx pour améliorer vos compétences.



