Content-Type dans C# HttpClient : comment le configurer sans casser la requête

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Pourquoi Content-Type est-il le cauchemar de chaque développeur C# ?

\n\n

Avez-vous déjà envoyé une requête POST via HttpClient en C#, et le serveur vous a répondu avec une mystérieuse erreur 415 (Unsupported Media Type) ? Cela vous dit quelque chose, n'est-ce pas ? La plupart du temps, le problème vient d'un tout petit en-tête, mais d'une importance cruciale : Content-Type. Sans lui, le serveur ne sait tout simplement pas comment interpréter vos données : est-ce du JSON, du XML ou un formulaire classique ?

\n\n

Dans cet article, nous allons voir comment définir correctement Content-Type pour HttpClient en C#, examiner les pièges les plus courants dans lesquels tombent les débutants (et pas seulement), et apprendre à envoyer des requêtes de manière à ce que le serveur vous comprenne à demi-mot. C'est parti !

\n\n

Qu'est-ce que Content-Type et pourquoi est-il nécessaire ?

\n\n

Content-Type est un en-tête HTTP qui indique au serveur dans quel format les données sont transmises dans le corps de la requête (ou de la réponse). Si vous envoyez du JSON, vous devez dire : application/json. Si c'est du XML — application/xml. Si ce sont des données de formulaire — application/x-www-form-urlencoded.

\n\n

En C#, HttpClient est un outil puissant mais perfide. Il peut parfois deviner le format tout seul, et parfois non. Et si vous essayez simplement d'ajouter l'en-tête via DefaultRequestHeaders, une mauvaise surprise vous attend : Content-Type ne fait pas partie des en-têtes de requête par défaut. Il ne concerne que le corps de la requête.

\n\n

Erreur typique de débutant

\n\n
var client = new HttpClient();\nclient.DefaultRequestHeaders.Add("Content-Type", "application/json"); // ❌ ERREUR !\n
\n\n

Ce code lèvera une exception InvalidOperationException avec le message : "Misused header name. Make sure request headers are used with HttpRequestMessage, response ones with HttpResponseMessage, and content ones with HttpContent objects." Cela semble effrayant, mais la solution est simple — lisez la suite.

\n\n

Trois façons de définir Content-Type dans C# HttpClient

\n\n

Méthode 1 : Utiliser StringContent (la plus simple)

\n\n

La manière la plus courante et correcte est de transmettre l'en-tête avec le corps de la requête via la classe StringContent.

\n\n
using System;\nusing System.Net.Http;\nusing System.Text;\nusing System.Threading.Tasks;\n\nclass Program\n{\n    static async Task Main()\n    {\n        var client = new HttpClient();\n        var json = "{ \\"name\\": \\"PythonLib\\", \\"type\\": \\"education\\" }";\n        \n        // Création du contenu avec indication explicite du Content-Type\n        var content = new StringContent(json, Encoding.UTF8, "application/json");\n        \n        var response = await client.PostAsync("https://api.example.com/data", content);\n        Console.WriteLine(await response.Content.ReadAsStringAsync());\n    }\n}\n
\n\n

Dans cet exemple, Content-Type: application/json; charset=utf-8 est défini automatiquement. Le deuxième paramètre (Encoding.UTF8) définit l'encodage, le troisième le type de média. Et voilà — le serveur est content !

\n\n

Méthode 2 : Via ByteArrayContent (pour les avancés)

\n\n

Si vous travaillez avec des données binaires ou souhaitez un contrôle total, utilisez ByteArrayContent.

\n\n
using System.Net.Http;\nusing System.Text;\n\nvar jsonBytes = Encoding.UTF8.GetBytes("{ \\"message\\": \\"Hello\\" }");\nvar content = new ByteArrayContent(jsonBytes);\ncontent.Headers.ContentType = new MediaTypeHeaderValue("application/json");\n\nvar response = await client.PostAsync("https://api.example.com/upload", content);\n
\n\n

Ici, nous définissons manuellement ContentType via la propriété Headers. Cette méthode est pratique lorsque vous devez ajouter des en-têtes supplémentaires (par exemple, Content-Encoding).

\n\n

Méthode 3 : HttpRequestMessage + contrôle total

\n\n

Parfois, vous devez envoyer une requête GET avec un corps (oui, c'est possible aussi) ou redéfinir les en-têtes au niveau de la requête. Alors, en

Blogs

Book Recommendations