Loupe

Consommer les APIs Rest de manière résiliente dans votre application avec Polly

De nos jours, la plupart des applications mobiles et desktops dépendent de services externes pour leur fonctionnement optimal. Que ce soit pour la consommation ou l’envoi des données via une Api REST, ou le téléchargement de données venant d’une source tierce, quand vous construisez une application qui dépend de services externes, la communication entre votre application et ces services ne sera surement pas à optimale 100% du temps. Plusieurs scénarios peuvent être à l’origine d’une rupture de connexion entre votre application et le service externe. Par exemple : la perte de connexion, ou une réponse inappropriée du service en question.

Cet article traite de la gestion élégante de certains de ces problèmes rencontrés lors de la consommation d'une API REST dans une application Xamarin.Forms à l'aide de Polly.

C’est Quoi Polly ?

Comme il est écrit dans le ReadMe sur Github, « Polly est une bibliothèque .NET de résilience et de gestion des incidents transitoires qui permet aux développeurs d'exprimer des stratégies telles que Réessayer, Disjoncteur, Timeout, Isolation de cloison et Repli de manière fluide et sécurisée pour les threads. »

Voici le projet Polly sur Github

Utilisation de Polly

Nous allons utiliser Polly pour faire des requêtes à une API à partir de notre application Xamarin Forms. L’application en question est un convertisseur de devises fait en Xamarin.Forms. Vous pouvez le trouver sur Github.

Pour utiliser Polly, vous devez l’installer via Nuget dans le projet approprié. Ceci peut être accompli en utilisant cette commande :

Install-Package Polly

Le but de cet exercice est de faire appel à l’API de conversion via cette application et de réessayer à chaque fois qu’on rencontre une exception du type HttpRequestException (c’est à dire quand notre application rencontrera un problème lors d’une requête). Grace à Polly, nous pouvons très facilement définir ce Policy et ajouter plusieurs autres critères pour le personnaliser à notre façon.

Trêve de bavardage, voici le code :

   async Task<HttpResponseMessage> QueryCurrencyServiceWithRetryPolicy(Func<Task<HttpResponseMessage>> action)
        {
            int numberOfTimesToRetry = 7;
            int retryMultiple = 2;

            // Gérer HttpRequestException quand cela se produit
            var response = await Policy.Handle<HttpRequestException>(ex =>
            {
                Debug.WriteLine("Request failed due to connectivity issues.");
                return true;
            })

            // attendre un nombre de secondes donné qui augmente après chaque tentative
            .WaitAndRetryAsync(numberOfTimesToRetry, retryCount => TimeSpan.FromSeconds(retryCount * retryMultiple))

            // Après la nouvelle tentative, exécutez les instructions approprié.
            .ExecuteAsync(async () => await action());

            // Renvoie le message de réponse obtenu à partir de l'appel du client http.
            return response;
        }

La partie du code au-dessus définit le Policy et prend une fonction à exécuter lors de ce Policy.

// Appelons maintenant notre politique de nouvelle tentative chaque fois que nous voulons interroger l'API. 
var response = await QueryCurrencyServiceWithRetryPolicy(() => _httpClient.GetAsync(ALL_CURRENCIES_URL));

Notez que « ALL_CURRENCIES_URL » est une constante qui contient l’URL vers l’API REST des devises à télécharger. Et la variable « _httpClient » fait un « GET » sur l’API. Ceci pourrait être remplacé par n’importe quel URL vers la quel vous voulez faire une requête GET.

Conclusion

Avec ça, nous avons une implémentation simple d’une politique qui réessaye une requête vers une API pour un nombre de fois précis, tout en augmentant le temps d’attente a chaque nouvelle requête faite. Ceci peut s’avérer très utile lors des requêtes faites vers une API dans une application mobile ou desktop, comme nous pouvons le constater dans l'application demo.

Photo de profil

Ces billets pourraient aussi vous intéresser

Vous nous direz ?!

Commentaires

comments powered by Disqus