428 votes

POSTing JsonObject avec HttpClient depuis une API Web

J'essaie d'envoyer un JsonObject en utilisant HttpClient à partir de l'API Web. Je ne sais pas vraiment comment m'y prendre et je n'ai pas trouvé beaucoup d'exemples de code.

Voici ce que j'ai pour l'instant :

var myObject = (dynamic)new JsonObject();
myObject.Data = "some data";
myObject.Data2 = "some more data";

HttpClient httpClient = new HttpClient("myurl");
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

HttpResponseMessage response = httpClient.Post("", ???);

Je pense que je dois lancer mon JsonObject en tant que StreamContent mais je m'accroche à cette étape.

687voto

pomber Points 1046

Avec la nouvelle version de HttpClient et sans le WebApi Ce serait un paquet :

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
var result = client.PostAsync(url, content).Result;

Ou si vous le voulez async :

var result = await client.PostAsync(url, content);

182voto

carlosfigueira Points 40778

Le moyen le plus simple est d'utiliser un StringContent avec la représentation JSON de votre objet JSON.

httpClient.Post(
    "",
    new StringContent(
        myObject.ToString(),
        Encoding.UTF8,
        "application/json"));

88voto

user3285954 Points 149

En fonction de votre version de .NET, vous pourriez également utiliser HttpClientExtensions.PostAsJsonAsync méthode.

https://msdn.microsoft.com/en-us/library/system.net.http.httpclientextensions.postasjsonasync.aspx

77voto

Matt Points 602

Si vous utilisez Newtonsoft.Json :

using Newtonsoft.Json;
using System.Net.Http;
using System.Text;

public static class Extensions
{
    public static StringContent AsJson(this object o)
        => new StringContent(JsonConvert.SerializeObject(o), Encoding.UTF8, "application/json");
}

Exemple :

var httpClient = new HttpClient();
var url = "https://www.duolingo.com/2016-04-13/login?fields=";
var data = new { identifier = "username", password = "password" };
var result = await httpClient.PostAsync(url, data.AsJson())

37voto

anthls Points 367

Je n'ai pas assez de réputation pour ajouter un commentaire sur la réponse de pomber, alors je poste une autre réponse. En utilisant l'approche de pomber, j'ai continué à recevoir une réponse "400 Bad Request" d'une API à laquelle j'envoyais ma requête JSON (Visual Studio 2017, .NET 4.6.2). Finalement, le problème est dû au fait que l'en-tête "Content-Type" produit par StringContent() était incorrect (cf. https://github.com/dotnet/corefx/issues/7864 ).

tl;dr

Utilisez la réponse de pomber avec une ligne supplémentaire pour définir correctement l'en-tête de la requête :

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;

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