Comment envoyer une requête HTTP POST en .NET avec C# : du simple au complexe
\n\nImaginez que votre application C# est un livreur qui doit livrer un colis (des données) à une adresse spécifique (URL) et obtenir un accusé de réception (réponse). C'est exactement ce que résout une requête HTTP POST. Sur Stack Overflow, cette question cumule des milliers de vues, et pour cause : travailler avec des API externes, envoyer des formulaires, télécharger des données sur un serveur — c'est le quotidien de tout développeur .NET.
\n\nDans cet article, nous allons explorer trois méthodes principales pour envoyer une requête POST en .NET (C#), en commençant par le moderne HttpClient et en terminant par l'ancien WebRequest. Vous apprendrez à transmettre du JSON, des données encodées en URL, à gérer les erreurs et à éviter les pièges qui guettent les débutants. C'est parti !
1. L'approche moderne : HttpClient (recommandé)
\n\nDepuis .NET Framework 4.5 et dans toutes les versions de .NET Core / .NET 5+, la classe HttpClient est le standard de facto. Elle est conçue pour le travail asynchrone, prend en charge la réutilisation des connexions et se configure facilement.
1.1. POST simple avec JSON (le scénario le plus courant)
\n\nSupposons que nous devions envoyer les données d'un utilisateur au serveur au format JSON. Voici à quoi cela ressemble en code réel :
\n\nusing System;\nusing System.Net.Http;\nusing System.Text;\nusing System.Text.Json;\nusing System.Threading.Tasks;\n\npublic class UserService\n{\n private readonly HttpClient _httpClient;\n\n public UserService(HttpClient httpClient)\n {\n _httpClient = httpClient;\n }\n\n public async Task<UserResponse> CreateUserAsync(UserDto newUser)\n {\n // 1. Sérialiser l'objet en JSON\n var json = JsonSerializer.Serialize(newUser);\n var content = new StringContent(json, Encoding.UTF8, "application/json");\n\n // 2. Envoyer le POST\n HttpResponseMessage response = await _httpClient.PostAsync("https://api.example.com/users", content);\n\n // 3. Lire la réponse\n response.EnsureSuccessStatusCode(); // Lève une exception si le statut n'est pas 2xx\n\n var responseBody = await response.Content.ReadAsStringAsync();\n return JsonSerializer.Deserialize<UserResponse>(responseBody);\n }\n}\n\n// Exemple d'utilisation\npublic class Program\n{\n public static async Task Main()\n {\n var client = new HttpClient();\n var service = new UserService(client);\n \n var user = new UserDto { Name = "Jean", Email = "jean@example.com" };\n var result = await service.CreateUserAsync(user);\n Console.WriteLine($"Utilisateur créé avec l'ID : {result.Id}");\n }\n}\n\npublic class UserDto\n{\n public string Name { get; set; }\n public string Email { get; set; }\n}\n\npublic class UserResponse\n{\n public int Id { get; set; }\n}\n\nPoints importants :
\n- \n
- Utilisez toujours
async/await— cela évite de bloquer le thread. \n EnsureSuccessStatusCode()est votre meilleur allié pour une vérification rapide des erreurs. \n - Ne créez pas un nouveau
HttpClientpour chaque requête — cela entraîne un épuisement des sockets. UtilisezIHttpClientFactorydans ASP.NET Core ou une instance statique unique. \n
1.2. POST avec données de formulaire (application/x-www-form-urlencoded)
\n\nParfois, l'API exige des données au format d'un formulaire HTML classique. Pour cela, utilisez FormUrlEncodedContent :
public async Task<string> PostFormDataAsync(string username, string password)\n{\n var formData = new Dictionary<string, string>\n {\n { "grant_type", "password" },\n { "username", username },\n { "password", password }\n };\n\n var content = new FormUrlEncodedContent(formData);\n\n using var client = new HttpClient();\n var response = await client.PostAsync("https://api.example.com/token", content);\n response.EnsureSuccessStatusCode();\n\n return await response.Content.ReadAsStringAsync();\n}\n\nAstuce pro : Pour les formulaires plus complexes avec fichiers joints, utilisez MultipartFormDataContent.
2. L'approche classique : WebRequest (pour la compatibilité)
\n\nBien que HttpClient soit recommandé, vous rencontrerez encore du code legacy utilisant WebRequest. Voici un exemple équivalent :
public string PostWithWebRequest(string url, string jsonData)\n{\n var request = (HttpWebRequest)WebRequest.Create(url);\n request.Method = "POST";\n request.ContentType = "application/json";\n\n byte[] bytes = Encoding.UTF8.GetBytes(jsonData);\n request.ContentLength = bytes.Length;\n\n using (var stream = request.GetRequestStream())\n {\n stream.Write(bytes, 0, bytes.Length);\n }\n\n using (var response = (HttpWebResponse)request.GetResponse())\n using (var reader = new StreamReader(response.GetResponseStream()))\n {\n return reader.ReadToEnd();\n }\n}\n\nAttention : WebRequest est obsolète dans .NET 6+. Utilisez-le uniquement si vous maintenez du code existant.
3. Gestion des erreurs et bonnes pratiques
\n\nVoici les pièges les plus fréquents et comment les éviter :
\n\n- \n
- Timeout : Définissez toujours un timeout avec
client.Timeout = TimeSpan.FromSeconds(30);\n - Erreurs réseau : Utilisez des blocs try-catch pour capturer
HttpRequestExceptionetTaskCanceledException. \n - Respect des limites de débit : Ajoutez un délai entre les requêtes si l'API a un rate limiting. \n
- Journalisation : Enregistrez les requêtes et réponses pour faciliter le débogage. \n
Conclusion
\n\nVous savez maintenant envoyer une requête HTTP POST en .NET avec C# comme un professionnel. Que vous utilisiez HttpClient pour des API modernes ou WebRequest pour de l'ancien code, ces techniques vous serviront au quotidien. N'oubliez pas de toujours gérer les erreurs et de suivre les bonnes pratiques pour des applications robustes.
Prêt à passer à la pratique ? Essayez d'intégrer ces exemples dans votre prochain projet .NET !