Comment mettre en œuvre une stratégie de nouvelle tentative pour les requêtes réseau utilisant Go et http.Transport ?
Lorsque nous effectuons des requêtes réseau, nous rencontrons souvent des requêtes qui échouent en raison de l'instabilité du réseau, d'anomalies du serveur et d'autres raisons. Afin d'améliorer le taux de réussite de la demande, nous pouvons utiliser la stratégie de nouvelle tentative pour renvoyer la demande jusqu'à ce que la demande réussisse ou que le nombre maximum de tentatives soit atteint. Cet article explique comment utiliser http.Transport dans le langage Go pour implémenter une stratégie de nouvelle tentative pour les requêtes réseau.
Tout d'abord, nous devons importer le package suivant :
import ( "fmt" "net/http" "time" )
Ensuite, nous devons créer un http.RoundTripper personnalisé pour implémenter la logique de nouvelle tentative. Nous pouvons créer un RoundTripper personnalisé basé sur http.Transport. Par exemple :
type RetryTransport struct { Transport http.RoundTripper Retries int }
Dans la structure RetryTransport, nous définissons deux champs : Transport et Retries. Le transport est un type http.RoundTripper utilisé pour envoyer des requêtes et recevoir des réponses. Les tentatives représentent le nombre maximum de tentatives.
Ensuite, nous devons implémenter la méthode RoundTrip dans l'interface RoundTripper, qui est utilisée pour envoyer des requêtes et recevoir des réponses. Dans cette méthode, nous pouvons implémenter une logique de nouvelle tentative. Par exemple :
func (r *RetryTransport) RoundTrip(req *http.Request) (*http.Response, error) { var resp *http.Response var err error for i := 0; i <= r.Retries; i++ { resp, err = r.Transport.RoundTrip(req) if err == nil && resp.StatusCode < 500 { break } time.Sleep(1 * time.Second) } return resp, err }
Dans la méthode RoundTrip, nous utilisons une boucle pour effectuer l'envoi et la réception des requêtes. Le nombre de boucles est déterminé par le nombre maximum de tentatives. Après l'envoi de chaque requête, nous vérifions si une erreur s'est produite et si le code d'état de la réponse est inférieur à 500 (indiquant une exception côté serveur). Si les conditions sont remplies, la requête réussit et la boucle est sautée ; sinon, la requête est renvoyée après 1 seconde d'attente.
Enfin, nous devons utiliser un RetryTransport personnalisé pour créer un http.Client pour l'envoi de requêtes. Par exemple :
func main() { retryTransport := &RetryTransport{ Transport: http.DefaultTransport, Retries: 3, } client := &http.Client{ Transport: retryTransport, } resp, err := client.Get("https://example.com") if err != nil { fmt.Println("请求出错:", err) return } defer resp.Body.Close() // 处理响应 // ... }
Dans l'exemple ci-dessus, nous avons créé un RetryTransport et l'avons désigné comme Transport de http.Client. Nous fixons le nombre maximum de tentatives à 3 fois. Nous utilisons ensuite la méthode client.Get pour envoyer la requête et traiter la réponse renvoyée.
En utilisant un RetryTransport personnalisé, nous pouvons mettre en œuvre une stratégie de nouvelle tentative pour les requêtes réseau. Lorsqu'une requête échoue, elle réessaiera automatiquement le nombre de fois spécifié pour améliorer le taux de réussite des requêtes réseau.
Pour résumer, cet article explique comment utiliser http.Transport et RoundTripper personnalisé en langage Go pour implémenter une stratégie de nouvelle tentative pour les requêtes réseau. En définissant le nombre de tentatives et le temps d'attente, nous pouvons mieux faire face à l'instabilité du réseau et aux exceptions du serveur, et améliorer le taux de réussite des requêtes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!