2011-05-24 24 views
136

Estoy intentando PUBLICAR un JsonObject usando HttpClient desde Web API. No estoy muy seguro de cómo hacerlo y no puedo encontrar mucho en el camino del código de muestra.POSTING JsonObject con HttpClient desde la API web

Esto es lo que tengo hasta ahora:

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("", ???); 

creo que es necesario para emitir mi JsonObject como StreamContent pero me voy a colgar en ese paso.

Respuesta

148

Con la nueva versión de HttpClient y sin el paquete WebAPI sería:

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

O si lo desea asíncrono:

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

Ese sobrecargado constructor de StringContent hizo el truco para mí. –

149

La manera más fácil es usar un StringContent, con la representación JSON de su objeto JSON.

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

Anote el tipo de contenido. Lo dejé afuera y me tuve que depurar por mucho más tiempo del que me gustaría. – Zapnologica

35

Dependiendo de su versión de .Net también puede utilizar el método HttpClientExtensions.PostAsJsonAsync.

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

+2

Ahora encontrado en Microsoft.AspNet.Client.WebApi nuget – jle

+1

Acabo de instalarlo desde Microsoft.AspNet.WebApi.Client –

+0

Esto resolvió mi problema. Estuve jugando durante mucho tiempo mientras aprobaba una clase de C# que contenía algunas propiedades que eran listas usando client.PostAsync, client.SendAsync ... obtenía resultados muy variados. Si la matriz estuviera vacía, mi solución de API la recogería, pero si la matriz tenía un elemento, el método del controlador no pudo modelar el enlace JSON. Gracias por esto .. Me parece que PostAsJsonAsync convierte de manera más confiable un objeto C# complejo en JSON. –

17

Si se utiliza 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"); 
} 

Ejemplo:

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()) 
+0

esto no es específico de asp.net core, es realmente genérico hasta incluso 4.5.6 – danatcofo

+0

'JsonConvert.SerializeObject' problemas usando *** DateTimes ISO 8601 *** Tipo: Local o UTC ... http: // www. hackered.co.uk/articles/useful-c-extensions-for-working-with-iso-8601-dates-and-strings – Kiquenet

Cuestiones relacionadas