POSTing JsonObject с помощью HttpClient из веб-API - PullRequest
229 голосов
/ 25 мая 2011

Я пытаюсь ПОСТАВИТЬ JsonObject, используя HttpClient из Web API.Я не совсем уверен, как это сделать, и не могу найти много примеров кода.

Вот что у меня есть:

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

Я думаю, мне нужно разыграть JsonObject как StreamContent, но я застрял на этом шаге.

Ответы [ 6 ]

337 голосов
/ 09 сентября 2016

С новой версией HttpClient и без пакета WebApi это будет:

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

Или, если хотите, асинхронно:

var result = await client.PostAsync(url, content);
157 голосов
/ 25 мая 2011

Самый простой способ - использовать StringContent с представлением JSON вашего объекта JSON.

httpClient.Post(
    "",
    new StringContent(
        myObject.ToString(),
        Encoding.UTF8,
        "application/json"));
52 голосов
/ 11 августа 2015

В зависимости от версии .NET вы также можете использовать метод HttpClientExtensions.PostAsJsonAsync.

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

38 голосов
/ 06 июля 2017

При использовании 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");
}

Пример:

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())
18 голосов
/ 28 мая 2018

У меня недостаточно репутации, чтобы добавить комментарий к ответу от pomber, поэтому я публикую другой ответ.Используя подход pomber, я продолжал получать ответ «400 Bad Request» от API, к которому я отправлял свой запрос JSON (Visual Studio 2017, .NET 4.6.2).В конечном счете проблема была связана с неправильным заголовком «Content-Type», созданным StringContent () (см. https://github.com/dotnet/corefx/issues/7864).

tl; dr

Используйте ответ pomber с дополнительной строкой для правильной установкизаголовок по запросу:

var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json");
content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
var result = client.PostAsync(url, content).Result;
0 голосов
/ 13 ноября 2018

код над ним в 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)

Надеюсь, эта помощь

...