Web API'dan HttpClient ile JsonObject POST


289

Web API JsonObjectkullanarak kullanarak POST çalışıyorum HttpClient. Ben bu konuda nasıl emin değilim ve çok örnek kod yolunu bulamıyorum.

Şimdiye kadar sahip olduğum şey:

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

Sanırım benim JsonObjectbir oyuncu olarak ihtiyacım var StreamContentama o adıma asılıyorum.

Yanıtlar:


442

Paketin yeni sürümü ile HttpClientve WebApipaketi olmadan :

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

Veya isterseniz async:

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

3
Bu aşırı yüklü StringContent yapıcı benim için hile yaptı.
Kaptan Kenpachi


2
usingBen böyle bir atmak için cazip herkes için: aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
maxshuty

Ben usingde StringContentyaratılışın etrafına koydum .
bcr

Bu yanıtı kullanarak JSON isteğimi POSTing (Visual Studio 2017, .NET 4.6.2) bir API "400 Kötü İstek" yanıtı almaya devam etti. Ayrıca var content = new StringContent(jsonObject.ToString(), Encoding.UTF8, "application/json")ben ayarlamak zorunda kaldı content.Headers.ContentType = new MediaTypeHeaderValue("application/json");. Daha fazla ayrıntı için aşağıdaki cevaba bakınız.
19'da anthls

161

En kolay yol, a StringContent, JSON nesnenizin JSON temsili ile kullanmaktır .

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

14
İçerik türüne dikkat edin. Dışarıda bıraktım ve istediğimden çok daha uzun süre hata ayıklama yaptım.
Zapnologica

Yine de StringContent örneğini atmamalısınız?
Phil Haselden

63

.NET sürümünüze bağlı olarak HttpClientExtensions.PostAsJsonAsyncyöntemi de kullanabilirsiniz .

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


4
Şimdi Microsoft.AspNet.Client.WebApi nuget'te bulundu
jle

2
Microsoft.AspNet.WebApi.Client
Adriaan Davel

Bu benim sorunumu çözdü. Client.PostAsync, client.SendAsync kullanarak Listeler bazı özellikler içeren bir C # sınıfı geçerken (uzun) için karışıklık oldu .. Çok karışık sonuçlar alıyordum. Dizi boş olsaydı API çözümüm onu ​​alırdı, ancak dizi bir öğeye sahipse denetleyici yöntemi JSON'u bağlayamadı. Bunun için teşekkürler .. Bana PostAsJsonAsync daha güvenilir bir karmaşık C # nesnesini JSON dönüştürür gibi görünüyor.
Franklin Tarter

Bunun için bir nuget paketi var mı? Projeyi yeni bir makineye aktardığımda bundan nefret ediyorum ve bu referans her zaman eksik.
Zapnologica

Bunu veya başka bir şeyi mi arıyorsunuz? nuget.org/packages/Microsoft.AspNet.WebApi.Client
user3285954

51

Newtonsoft.Json kullanıyorsanız:

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

Misal:

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

Bu asp.net çekirdeğe özgü değil, aslında
4.5.6'ya

JsonConvert.SerializeObjectDateTimes ISO 8601 ile ilgili sorunlar Tür: Yerel veya UTC ... hackered.co.uk/articles/…
Kiquenet

21

Pomber'ın cevabına bir yorum eklemek için yeterli itibarım yok, bu yüzden başka bir cevap gönderiyorum. Pomber yaklaşımını kullanarak, JSON isteğimi POSTing (Visual Studio 2017, .NET 4.6.2) bir API "400 Kötü İstek" yanıtı almaya devam etti. Sonunda sorun StringContent () tarafından üretilen "Content-Type" üstbilgisi yanlış olarak izlendi (bkz. Https://github.com/dotnet/corefx/issues/7864 ).

tl; Dr.

Başlığı isteğe göre doğru ayarlamak için bombacının cevabını fazladan bir satırla kullanın:

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

Teşekkürler, karıncalar. var content = new StringContent (jsonObject.ToString (), Encoding.UTF8, "application / json") yeterli değildi. Content.Headers.ContentType = new MediaTypeHeaderValue ("application / json"); Aklımı kurtardığın için teşekkürler.
Gail Foad

1
Bu harika çalıştı. "Application / json" ın biri yapıcıda ve bir kez de mülk aracılığıyla iki kez ayarlanması gerektiğinin herhangi bir nedeni var mı? Bu bir hata mı?
Festus Martingale

@FestusMartingale: güzel soru! (Yanıtında bağlantılı) github sorunu geçmesiyle benim okuma itibaren "application/json"de StringContentaçıkça ortaya çıkan ayarlanmış ediliyor olarak yapıcı muhtemelen gerekli değildir content.Headers.ContentTypemülkiyet. Ancak, bunu kodda test etmedim.
19'da

Sunucu tam içerik türü dizesini desteklemiyor gibi görünüyor. ContentType'ı geçersiz kılmadan yapıcıyı kullandığınızda, değeri olarak ayarlar application/json; charset=utf-8.
Bertm13

2

vbnet içindeki kod:

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)

Umarım bu yardım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.