Comment passer un object à HttpClient.PostAsync et sérialiser en tant que corps JSON?

J’utilise System.Net.Http , j’ai trouvé plusieurs exemples sur le web. J’ai réussi à créer ce code pour faire une requête POST :

 public static ssortingng POST(ssortingng resource, ssortingng token) { using (var client = new HttpClient()) { client.BaseAddress = new Uri(baseUri); client.DefaultRequestHeaders.Add("token", token); var content = new FormUrlEncodedContent(new[] { new KeyValuePair("", "") }); var result = client.PostAsync("", content).Result; ssortingng resultContent = result.Content.ReadAsSsortingngAsync().Result; return resultContent; } } 

tout fonctionne bien. Mais supposons que je veuille passer un troisième paramètre à la méthode POST , un paramètre appelé data . Le paramètre de données est un object comme celui-ci:

 object data = new { name = "Foo", category = "article" }; 

comment puis-je faire cela sans créer le KeyValuePair ? Mon php RestAPI attend une entrée json, alors le FormUrlEncodedContent devrait envoyer le FormUrlEncodedContent json raw correctement. Mais comment puis-je faire cela avec Microsoft.Net.Http ? Merci.

La réponse directe à votre question est: Non. La signature de la méthode PostAsync est la suivante:

public Task PostAsync (Uri requestUri, contenu HttpContent)

Ainsi, bien que vous puissiez passer un object à PostAsync il doit être de type HttpContent et votre type anonyme ne répond pas à ce critère.

Cependant, il existe des moyens d’accomplir ce que vous voulez accomplir. Tout d’abord, vous devez sérialiser votre type anonyme en JSON, l’outil le plus courant étant Json.NET . Et le code pour cela est assez sortingvial:

 var myContent = JsonConvert.SerializeObject(data); 

Ensuite, vous devrez construire un object de contenu pour envoyer ces données, je vais utiliser un object ByteArrayContent , mais vous pouvez utiliser ou créer un type différent si vous le souhaitez.

 var buffer = System.Text.Encoding.UTF8.GetBytes(myContent); var byteContent = new ByteArrayContent(buffer); 

Ensuite, vous souhaitez définir le type de contenu pour indiquer à l’API qu’il s’agit d’un JSON.

 byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 

Ensuite, vous pouvez envoyer votre demande très similaire à votre exemple précédent avec le contenu du formulaire:

 var result = client.PostAsync("", byteContent).Result 

Sur un côté, appeler la propriété .Result comme vous le faites ici peut avoir des effets secondaires néfastes tels que le locking à vide, vous devez donc faire attention à cela.

Vous devez transmettre vos données dans le corps de la requête en tant que chaîne brute plutôt que FormUrlEncodedContent . Une façon de faire est de le sérialiser dans une chaîne JSON:

 var json = JsonConvert.SerializeObject(data); 

Il ne vous rest plus qu’à passer la chaîne à la méthode post.

 var ssortingngContent = new SsortingngContent(json, UnicodeEncoding.Utf8, "application/json"); var client = new HttpClient(); var response = await client.PostAsync(uri, ssortingngContent); 

Une solution simple consiste à utiliser le Microsoft ASP.NET Web API 2.2 Client partir de NuGet .

Ensuite, vous pouvez simplement faire cela et sérialiser l’object en JSON et définir l’en Content-Type tête Content-Type sur application/json; charset=utf-8 application/json; charset=utf-8 :

 var data = new { name = "Foo", category = "article" }; var client = new HttpClient(); client.BaseAddress = new Uri(baseUri); client.DefaultRequestHeaders.Add("token", token); var response = await client.PostAsJsonAsync("", data);