Wyślij wiadomość HTTP POST w ASP.NET Core przy użyciu HttpClient PostAsJsonAsync


143

Chcę wysłać obiekt dynamiczny, taki jak

new { x = 1, y = 2 };

jako treść wiadomości HTTP POST. Więc staram się pisać

var client = new HttpClient();

ale nie mogę znaleźć metody

client.PostAsJsonAsync()

Próbowałem więc dodać pakiet Microsoft.AspNetCore.Http.Extensions do project.json i dodać

using Microsoft.AspNetCore.Http.Extensions; 

klauzula use. Jednak to mi nie pomogło.

Jaki jest więc najłatwiejszy sposób wysyłania żądania POST z treścią JSON w ASP.NET Core?


Zastanawiam się, dlaczego ten artykuł nie zawiera przykładu dla POST docs.microsoft.com/en-us/dotnet/csharp/tutorials/ ...
joym8

Odpowiedzi:


206

Należy dodać odniesienie do pakietu „Microsoft.AspNet.WebApi.Client” (przykłady można znaleźć w tym artykule ).

Bez dodatkowego rozszerzenia możesz skorzystać ze standardowej PostAsyncmetody:

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

gdzie jsonInStringwartość można uzyskać dzwoniącJsonConvert.SerializeObject(<your object>);


1
Ale Microsoft.AspNet.WebApi.Client nie wygląda jak biblioteka ASP.NET Core RC2. Drugi sposób to naprawdę zbyt wiele powtórzeń kodu ((
Rem,

@Rem, dlaczego nie utworzysz HttpClient metody rozszerzającej ( PostAsJsonAsync), aby używać drugiego sposobu. Pozwala uniknąć powtórzeń kodu.
adem caglin

1
Pewnie. Ale zadałem pytanie, aby dowiedzieć się, czy czegoś mi brakuje. Nie mogę uwierzyć, że nie został jeszcze zaimplementowany w Core!
Rem

1
Ta biblioteka nie jest standardem core / .net, nie sądzę, że System.Net.Http.Formatting został jeszcze przeniesiony
Chris S

1
Będzie to działać dla HttpClient utworzonego przez IHttpClientFactory w .NET Core 2.2 z pakietu NuGet Microsoft.Extensions.Http. Jednak jak to zrobić w ten sposób, ale dodaj nagłówki, takie jak klucz autoryzacyjny.
Nick Gallimore

98

Używam tej klasy:

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

Próbka użycia:

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

5
Dlaczego nie metoda rozszerzenia? public static class JsonContent {public Task <?> PostAsJSonAsync (ten klient HttpClient, obiekt toSerializeAsJson) {...}}
TamusJRoyce

2
Podoba mi się podejście klasowe JsonContent
Marco Alves

Czy to ustawia Content-Length:nagłówek HTTP?
Wiaczesław Napadowski

1
@VyacheslavNapadovsky zależy to od HttpClientustawień, np. Czy jeden client.DefaultRequestHeaders.TransferEncodingChunked = true Content-Lengthnagłówek zestawu nie zostałby ustawiony i Transfer-Encoding: chunkedzostałby ustawiony zamiast tego. Jeśli jednak utworzy się klienta var client = new HttpClient();, nagłówek Content-Lengthzostanie domyślnie ustawiony dla tej klasy zawartości.
stop-cran

12

Dodałbym do zaakceptowanej odpowiedzi, że chciałbyś również dodać Acceptnagłówek do httpClient:

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

tak, dla mnie to również jest wymagane, potwierdzone listonoszem.
Weihui Guo

1

Masz rację, że zostało to już dawno zaimplementowane w .NET Core.

W chwili pisania tego tekstu (wrzesień 2019 r.) project.jsonPlik NuGet 3.x + został zastąpiony przez PackageReference(jak wyjaśniono na https://docs.microsoft.com/en-us/nuget/archive/project-json ).

Aby uzyskać dostęp do *Asyncmetod HttpClientklasy, .csprojplik musi być poprawnie skonfigurowany.

Otwórz .csprojplik w zwykłym edytorze tekstu i upewnij się, że pierwsza linia jest
<Project Sdk="Microsoft.NET.Sdk.Web">
(jak wskazano na https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#the -csproj-format ).

Aby uzyskać dostęp do *Asyncmetod HttpClientklasy, musisz również mieć w swoim pliku poprawne odwołanie do pakietu.csproj , na przykład:

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

(Zobacz https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference . Ponadto: zalecamy aplikacje ukierunkowane na ASP.NET Core 2.1 i później użyj metapakietu Microsoft.AspNetCore.App , https://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage )

Metody takie jak PostAsJsonAsync, ReadAsAsync, PutAsJsonAsynci DeleteAsyncpowinien działać po wyjęciu z pudełka. (Nie jest wymagana dyrektywa using).

Aktualizacja: tag PackageReference nie jest już potrzebny w programie .NET Core 3,0.


Nie udało mi się zmusić PostAsJsonAsync do pracy z .NET Core 3.1. Dzięki
Chris Kolenko
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.