168 votes

Comment passer un objet à HttpClient.PostAsync et le 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 un POST demande :

public static string POST(string resource, string token)
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri(baseUri);
        client.DefaultRequestHeaders.Add("token", token);

        var content = new FormUrlEncodedContent(new[]
        {
             new KeyValuePair<string, string>("", "")
        });

        var result = client.PostAsync("", content).Result;
        string resultContent = result.Content.ReadAsStringAsync().Result;
        return resultContent;
    }
 }

tout fonctionne bien. Mais supposons que je veuille passer un troisième paramètre à la fonction POST un paramètre appelé data . Le paramètre de données est un objet 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, donc le FormUrlEncodedContent devrait envoyer le raw json correctement. Mais comment puis-je faire cela avec Microsoft.Net.Http ? Merci.

0 votes

Si je comprends bien votre question, vous voulez envoyer un contenu JSON au lieu d'un contenu codé par formulaire (et par extension vous voulez que votre type anonyme soit sérialisé en JSON dans ce contenu) ?

0 votes

@CodingGorilla oui est un type anonyme.

4 votes

À titre d'avertissement pour les futurs lecteurs, n'utilisez pas de fichier using pour le HttpClient . aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong

24voto

Charles Thayer Points 81

@arad bon point. En fait, je viens de trouver cette méthode d'extension (.NET 5.0) :

PostAsJsonAsync<TValue>(HttpClient, String, TValue, CancellationToken)

de https://docs.microsoft.com/en-us/dotnet/api/system.net.http.json.httpclientjsonextensions.postasjsonasync?view=net-5.0

Donc on peut maintenant :

var data = new { foo = "Hello"; bar = 42; };
var response = await _Client.PostAsJsonAsync(_Uri, data, cancellationToken);

5voto

Gustavo Moraes Points 21

Deux options s'offrent à vous, selon le framework que vous codez : vous pouvez simplement faire JsonContent.Create(yourObject); si vous êtes sur .Net 5

ou créer une méthode d'extension et l'appeler sur votre objet :

public static StringContent GetStringContent(this object obj)
{
    var jsonContent = JsonConvert.SerializeObject(obj);
    var contentString = new StringContent(jsonContent, Encoding.UTF8, "application/json");
    contentString.Headers.ContentType = new MediaTypeHeaderValue("application/json");

    return contentString;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X