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);