HttpClient PostAsJsonAsync kullanarak ASP.NET Core'da HTTP POST iletisi gönderme


143

Gibi dinamik bir nesne göndermek istiyorum

new { x = 1, y = 2 };

HTTP POST mesajının gövdesi olarak. Bu yüzden yazmaya çalışıyorum

var client = new HttpClient();

ama yöntem bulamıyorum

client.PostAsJsonAsync()

Bu yüzden project.json için Microsoft.AspNetCore.Http.Extensions paketini eklemeye çalıştım ve

using Microsoft.AspNetCore.Http.Extensions; 

cümlesi kullanır. Ancak bana yardımcı olmadı.

Peki ASP.NET Core JSON gövdesi ile POST isteği göndermek için en kolay yolu nedir?


Bu makalenin neden POST için bir örnek içermediğini merak ediyorum docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
joym8

Yanıtlar:


206

"Microsoft.AspNet.WebApi.Client" paketine başvuru eklemelisiniz ( örnekler için bu makaleyi okuyun ).

Herhangi bir ek uzantı olmadan, standart PostAsyncyöntemi kullanabilirsiniz :

client.PostAsync(uri, new StringContent(jsonInString, Encoding.UTF8, "application/json"));

nerede jsonInStringdeğeri arayarak alabilirsinizJsonConvert.SerializeObject(<your object>);


1
Ancak Microsoft.AspNet.WebApi.Client, ASP.NET Core RC2 kütüphanesine benzemiyor. Ve ikincil yol gerçekten kod tekrarı çok fazla ((
Rem

@ Neden ikinci yolu kullanmak için bir HttpClient uzantı yöntemi ( PostAsJsonAsync) oluşturmuyorsunuz . Kod tekrarını önlemenizi sağlar.
adem caglin

1
Elbette. Ama bir şey eksik olduğumu öğrenmek için soruyu sordum. Henüz Core'da uygulanmadığına inanamıyorum!
Rem

1
Bu kütüphane çekirdek / .net standardı bir kütüphane değil, System.Net.Http.Formatting henüz taşınmadı
Chris S

1
Bu, .NET Core 2.2'deki IHttpClientFactory tarafından Microsoft.Extensions.Http nuget paketinden oluşturulan HttpClient için çalışacaktır. Ancak, bunu bu şekilde nasıl yaparsınız, ancak yetkilendirme anahtarı gibi başlıklar ekleyin.
Nick Gallimore

99

Bu sınıfı kullanıyorum:

public class JsonContent : StringContent
{
    public JsonContent(object obj) :
        base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
    { }
}

Kullanım örneği:

new HttpClient().PostAsync("http://...", new JsonContent(new { x = 1, y = 2 }));

5
Neden bir genişletme yöntemi olmasın? public static class JsonContent {public Task <?> PostAsJSonAsync (bu HttpClient istemcisi, toSerializeAsJson nesnesi) {...}}
TamusJRoyce

2
JsonContent sınıfı yaklaşımını seviyorum
Marco Alves

Bu Content-Length:HTTP üstbilgisini ayarlıyor mu ?
Vyacheslav Napadovsky

1
@VyacheslavNapadovsky HttpClientayarlara bağlıdır , örneğin bir set client.DefaultRequestHeaders.TransferEncodingChunked = true Content-Lengthbaşlığı ayarlanmazsa ve Transfer-Encoding: chunkedbunun yerine ayarlanırsa. Ancak, istemciyi aşağıdaki gibi oluşturursa, varsayılan olarak bu içerik sınıfı için var client = new HttpClient();başlık Content-Lengthayarlanır.
stop-cran

12

AcceptBaşlığı da eklemek istediğiniz kabul edilen cevaba eklerim httpClient:

httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

evet, bu da bana postacı kullanılarak onaylandı.
Weihui Guo

1

Bunun uzun zamandır .NET Core'da uygulandığını haklıyorsunuz.

Yazma sırasında (Eylül 2019), project.jsonNuGet 3.x + dosyasının yerini almıştır PackageReference( https://docs.microsoft.com/en-us/nuget/archive/project-json adresinde açıklandığı gibi ).

Sınıfın *Asyncyöntemlerine erişmek için dosyanızın doğru yapılandırılması gerekir.HttpClient.csproj

.csprojDosyanızı düz bir metin düzenleyicide açın ve ilk satırın
<Project Sdk="Microsoft.NET.Sdk.Web">
( https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#the adresinde belirtildiği gibi olduğundan emin olun. -csproj-biçimi ).

Sınıf *Asyncyöntemlerine erişmek için dosyanızda HttpClientdoğru paket referansına da sahip olmanız gerekir .csproj, örneğin:

<ItemGroup>
    <!-- ... -->
    <PackageReference Include="Microsoft.AspNetCore.App" />
    <!-- ... -->
</ItemGroup>

(Bkz. Https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference . Ayrıca: ASP.NET Core 2.1 ve daha sonra Microsoft.AspNetCore.App meta paketini kullanın , https://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage )

Gibi yöntemler PostAsJsonAsync, ReadAsAsync, PutAsJsonAsyncve DeleteAsyncşimdi kutunun dışında çalışması gerekir. (Direktif kullanma gerekmez.)

Güncelleştirme: PackageReference etiketi artık .NET Core 3.0'da gerekli değildir.


PostAsJsonAsync'in .NET Core 3.1 ile çalışmasını sağlayamadım. Teşekkürler
Chris Kolenko
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.