Introduction : pourquoi un client HTTP correct est nécessaire en C#
Dans le développement moderne sur la plateforme .NET, pratiquement aucune application ne se passe d'interaction avec des serveurs distants. Qu'il s'agisse de récupérer des données d'une REST API, d'envoyer des formulaires à un serveur web ou de télécharger des fichiers, tout cela nécessite une implémentation correcte des requêtes HTTP. En C#, il existe plusieurs approches, mais la plus moderne et recommandée est la classe HttpClient de l'espace de noms System.Net.Http. Dans cet article, nous allons voir comment créer correctement un client HTTP en C#, éviter les erreurs typiques et écrire un code efficace.
Classes principales pour travailler avec HTTP en C# (.NET)
Avant de passer aux exemples, il est important de comprendre quels outils la plateforme .NET fournit. Les classes principales :
- HttpClient — la classe principale pour envoyer des requêtes et recevoir des réponses. Elle doit être utilisée comme un singleton (une seule instance pour toute l'application).
- HttpRequestMessage — permet de configurer la requête en détail : méthode, en-têtes, corps, version du protocole.
- HttpResponseMessage — contient la réponse du serveur : statut, en-têtes, corps.
- HttpContent — classe de base pour représenter le corps d'une requête ou d'une réponse (par exemple,
StringContent,ByteArrayContent,MultipartFormDataContent).
Règle clé : ne créez pas une nouvelle instance de HttpClient pour chaque requête. Cela entraîne l'épuisement des sockets et une baisse des performances. Utilisez une seule instance statique ou injectée.
Configuration de HttpClient : exemple de base
Examinons une configuration minimale. Créons une instance de HttpClient et définissons l'adresse de base :
using System;using System.Net.Http;using System.Threading.Tasks;
public class ApiService{ private static readonly HttpClient client = new HttpClient();
public ApiService() { client.BaseAddress = new Uri("https://api.example.com/"); client.DefaultRequestHeaders.Add("User-Agent", "C# HttpClient App"); client.DefaultRequestHeaders.Accept.Add( new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); }
public async Task<string> GetDataAsync(string endpoint) { HttpResponseMessage response = await client.GetAsync(endpoint); response.EnsureSuccessStatusCode(); // Lèvera une exception en cas d'erreur return await response.Content.ReadAsStringAsync(); }}Notez l'utilisation de response.EnsureSuccessStatusCode() — c'est un moyen simple de vérifier que la requête a réussi (code 2xx).
Exemples pratiques de requêtes HTTP en C#
Passons maintenant à des scénarios concrets. Nous allons voir les requêtes GET et POST, ainsi que la gestion des en-têtes et le traitement des erreurs.
1. Requête GET avec paramètres
Pour passer des paramètres dans la chaîne de requête, vous pouvez utiliser la collection QueryHelpers de Microsoft.AspNetCore.WebUtilities ou simplement former l'URL manuellement. Voici un exemple avec une formation manuelle :
public async Task<string> SearchUsersAsync(string name, int page){ var query = $"/users?name={Uri.EscapeDataString(name)}&page={page}"; HttpResponseMessage response = await client.GetAsync(query); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync();}Utilisez toujours Uri.EscapeDataString() pour échapper les paramètres, afin d'éviter les erreurs avec les caractères spéciaux.
2. Requête POST avec corps JSON
Pour envoyer des données au format JSON, il est pratique d'utiliser la bibliothèque System.Text.Json (ou Newtonsoft.Json). Convertissons l'objet en JSON et envoyons-le :
using System.Text;using System.Text.Json;
public