web-dev-qa-db-fra.com

POSTing JsonObject avec HttpClient à partir d'une API Web

J'essaie de POST une JsonObject en utilisant HttpClient à partir de l'API Web. Je ne sais pas trop comment procéder et je ne trouve pas grand-chose en échantillon de code. 

Voici ce que j'ai jusqu'à présent:

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 ma JsonObject en tant que StreamContent mais je commence à être suspendu à cette étape. 

187
Mark

Avec la nouvelle version de HttpClient et sans le package WebApi, ce serait:

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

Le moyen le plus simple consiste à utiliser une variable StringContent avec la représentation JSON de votre objet JSON.

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

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

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

47
user3285954

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())
31

Je n'ai pas assez de réputation pour ajouter un commentaire à la réponse de pomber, alors je poste une autre réponse. En utilisant l'approche de pomberie, j'ai continué à recevoir une réponse "400 requêtes incorrectes" d'une API à laquelle je postais ma requête JSON (Visual Studio 2017, .NET 4.6.2). Le problème a finalement été attribué à l’en-tête "Content-Type" généré par StringContent () étant incorrect (voir 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 demande:

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

le code dessus dans vbnet:

dim FeToSend as new (object--> define class)

Dim client As New HttpClient
Dim content = New StringContent(FeToSend.ToString(), Encoding.UTF8,"application/json")
content.Headers.ContentType = New MediaTypeHeaderValue( "application/json" )
Dim risp = client.PostAsync(Chiamata, content).Result

msgbox(risp.tostring)

J'espère que cette aide

0
Stefano Ronchese