Client HTTP en C# : faire des requêtes correctement de A à Z
\n\nDans le développement moderne sur la plateforme .NET, le travail avec les requêtes HTTP est l'une des tâches clés. Qu'il s'agisse d'intégration avec une API REST externe, d'envoi de données vers un serveur ou de téléchargement de pages web, l'utilisation correcte de HttpClient en C# est cruciale pour les performances et la stabilité de l'application. Dans cet article, nous aborderons tous les aspects du travail avec un client HTTP en C# : des exemples de base aux techniques avancées, à la gestion des erreurs et aux meilleures pratiques.
1. Bases du travail avec HttpClient en C#
\n\nHttpClient est la classe principale dans .NET pour envoyer des requêtes HTTP et recevoir des réponses. Elle se trouve dans l'espace de noms System.Net.Http et est disponible depuis .NET Framework 4.5 et toutes les versions de .NET Core/.NET 5+.
Règle importante : HttpClient est conçu pour être réutilisé. Créer une nouvelle instance pour chaque requête est un anti-modèle qui peut entraîner un épuisement des sockets (socket exhaustion). Utilisez plutôt une instance statique ou singleton.
Exemple de base d'une requête GET :
\n\nusing System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n{\n private static readonly HttpClient client = new HttpClient();\n\n static async Task Main(string[] args)\n {\n try\n {\n HttpResponseMessage response = await client.GetAsync("https://api.example.com/data");\n response.EnsureSuccessStatusCode();\n string responseBody = await response.Content.ReadAsStringAsync();\n Console.WriteLine(responseBody);\n }\n catch (HttpRequestException e)\n {\n Console.WriteLine($"Erreur de requête : {e.Message}");\n }\n }\n}\n\nDans cet exemple, nous créons un HttpClient statique, envoyons une requête GET, vérifions le succès de la réponse avec EnsureSuccessStatusCode() et lisons le corps de la réponse sous forme de chaîne.
2. Types de requêtes HTTP et travail avec les en-têtes
\n\nEn plus de GET, HttpClient prend en charge toutes les méthodes HTTP principales : POST, PUT, DELETE, PATCH et autres. Examinons l'envoi d'une requête POST avec des données JSON — c'est le scénario le plus courant lors du travail avec une API REST.
Exemple de requête POST avec JSON :
\n\nusing System;\nusing System.Net.Http;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading.Tasks;\n\nclass Program\n{\n private static readonly HttpClient client = new HttpClient();\n\n static async Task Main(string[] args)\n {\n var data = new { Name = "John", Age = 30 };\n string json = JsonSerializer.Serialize(data);\n var content = new StringContent(json, Encoding.UTF8, "application/json");\n\n try\n {\n HttpResponseMessage response = await client.PostAsync("https://api.example.com/users", content);\n response.EnsureSuccessStatusCode();\n string result = await response.Content.ReadAsStringAsync();\n Console.WriteLine($"Utilisateur créé : {result}");\n }\n catch (HttpRequestException e)\n {\n Console.WriteLine($"Erreur : {e.Message}");\n }\n }\n}\n\nTravail avec les en-têtes : Souvent, les API exigent la transmission de jetons d'authentification ou d'autres en-têtes. On peut les ajouter de deux manières :
\n\n- \n
- Globalement — via la propriété
DefaultRequestHeaders(pour toutes les requêtes du client). \n - Localement — via la collection
Headersdans l'objetHttpRequestMessage(pour une requête spécifique). \n
Exemple d'ajout de l'en-tête Authorization :
\n\n// Globalement\nclient.DefaultRequestHeaders.Authorization = \n new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "votre-token");\n\n// Localement\nvar request = new HttpR