Introduction : pourquoi un client HTTP approprié en C# est important
Dans le développement C# (.NET) moderne, travailler avec des requêtes HTTP est une nécessité fondamentale. Qu'il s'agisse d'appeler une API REST, de télécharger des données depuis un serveur web ou d'intégrer des services cloud — un client HTTP fiable est essentiel. Cependant, de nombreux développeurs, en particulier les débutants, commettent des erreurs typiques : une gestion incorrecte des connexions, l'ignorance des délais d'attente ou un traitement inefficace des réponses. Dans cet article, nous allons détailler la création d'un client HTTP en C#, des bases aux techniques avancées.
Nous examinerons la classe HttpClient — l'outil principal pour travailler avec HTTP dans .NET, ainsi que des approches alternatives. Vous apprendrez à envoyer correctement des requêtes GET et POST, à gérer le JSON, à manipuler les en-têtes et à éviter les problèmes de performance courants.
Les bases : créer et configurer HttpClient
Initialisation correcte de HttpClient
La classe HttpClient est conçue pour être réutilisée. Créer une nouvelle instance pour chaque requête est un anti-modèle qui peut entraîner un épuisement des sockets. Utilisez plutôt une instance unique pour toute l'application ou l'injection de dépendances (DI) via IHttpClientFactory.
// Incorrect : création pour chaque requêtepublic async Task<string> BadRequest(string url){ using (var client = new HttpClient()) { return await client.GetStringAsync(url); }}
// Correct : instance statiquepublic static readonly HttpClient SharedClient = new HttpClient();
// Ou via IHttpClientFactory (recommandé pour ASP.NET Core)services.AddHttpClient("MyClient", client =>{ client.BaseAddress = new Uri("https://api.example.com"); client.DefaultRequestHeaders.Add("Accept", "application/json");});Configuration des délais d'attente et de l'adresse de base
Les délais d'attente protègent l'application contre les blocages lorsque le serveur est indisponible. HttpClient a son propre délai d'attente, mais il peut être remplacé.
HttpClient client = new HttpClient{ BaseAddress = new Uri("https://jsonplaceholder.typicode.com"), Timeout = TimeSpan.FromSeconds(10) // 10 secondes pour l'ensemble de la requête};Il est également utile de définir MaxResponseContentBufferSize pour limiter la taille des données reçues.
Envoi de requêtes : GET, POST, PUT et DELETE
Requête GET : récupération de données
La façon la plus simple d'obtenir des données est GetStringAsync ou GetAsync avec un traitement manuel.
public async Task<string> GetUsersAsync(){ HttpResponseMessage response = await SharedClient.GetAsync("/users"); response.EnsureSuccessStatusCode(); // lève une exception en cas d'erreur return await response.Content.ReadAsStringAsync();}
// Ou encore plus simple :string json = await SharedClient.GetStringAsync("/users");Requête POST : envoi de données
Pour envoyer du JSON, utilisez PostAsJsonAsync (nécessite le package System.Net.Http.Json).
var newUser = new { name = "Ivan", email = "ivan@example.com" };HttpResponseMessage response = await SharedClient.PostAsJsonAsync("/users", newUser);if (response.IsSuccessStatusCode){ var createdUser = await response.Content.ReadFromJsonAsync<User>();}Pour envoyer un formulaire, utilisez FormUrlEncodedContent.
var formData = new Dictionary<string, string>{ { "username", "admin" }, { "password", "secret" }};var content = new FormUrlEncodedContent(formData);HttpResponseMessage response = await SharedClient.PostAsync("/login", content);Requêtes PUT et DELETE
La mise à jour et la suppression se font de manière similaire :
// PUTvar updateData = new { id = 1, name = "Updated name" };HttpResponseMessage putR