Wysyłanie JsonObject z HttpClient z Web API

Próbuję opublikować JsonObject używając HttpClient Z Web API. Nie jestem do końca pewien, jak to zrobić i nie mogę znaleźć wiele w drodze przykładowego kodu.

Oto co mam do tej pory:

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("", ???);
[[5]} myślę, że muszę rzucić Moje {[1] } jako StreamContent, ale jestem zawieszony na tym kroku.
Author: Mark, 2011-05-25

5 answers

Z nową wersją HttpClient i bez pakietu WebApi byłoby to:

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

Or if you want it async:

var result = await client.PostAsync(url, content);
 219
Author: pomber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 20:46:26

Najprostszym sposobem jest użycie StringContent, z reprezentacją JSON Twojego obiektu JSON.

httpClient.Post(
    "",
    new StringContent(
        myObject.ToString(),
        Encoding.UTF8,
        "application/json"));
 153
Author: carlosfigueira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-03 16:13:14

W zależności od wersji. NET możesz również użyć metody HttpClientExtensions.PostAsJsonAsync.

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

 44
Author: user3285954,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-17 13:33:39

Jeśli używasz 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");
}

Przykład:

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())
 27
Author: Matthew Steven Monkan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-03 02:06:59

Nie mam wystarczającej reputacji, aby dodać komentarz do odpowiedzi od pomber więc zamieszczam kolejną odpowiedź. Korzystając z podejścia pombera otrzymywałem odpowiedź "400 Bad Request" z API, do którego wysyłałem moje żądanie JSON (Visual Studio 2017,. NET 4.6.2). Ostatecznie problem został wytropiony, ponieważ nagłówek" Content-Type " wytwarzany przez StringContent () jest nieprawidłowy (zobacz https://github.com/dotnet/corefx/issues/7864).

Tl;dr

Użyj odpowiedzi pombera z dodatkową linijką aby poprawnie ustawić nagłówek na żądanie:

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;
 7
Author: anthls,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-28 02:54:50