Invia un messaggio POST HTTP in ASP.NET Core utilizzando HttpClient PostAsJsonAsync


143

Voglio inviare oggetti dinamici come

new { x = 1, y = 2 };

come corpo del messaggio POST HTTP. Quindi provo a scrivere

var client = new HttpClient();

ma non riesco a trovare il metodo

client.PostAsJsonAsync()

Quindi ho provato ad aggiungere il pacchetto Microsoft.AspNetCore.Http.Extensions a project.json e aggiungere

using Microsoft.AspNetCore.Http.Extensions; 

usa la clausola. Tuttavia non mi ha aiutato.

Quindi qual è il modo più semplice per inviare una richiesta POST con il corpo JSON in ASP.NET Core?


Mi chiedo perché questo articolo non contiene un esempio di POST docs.microsoft.com/en-us/dotnet/csharp/tutorials/…
joym8

Risposte:


206

È necessario aggiungere un riferimento al pacchetto "Microsoft.AspNet.WebApi.Client" (leggere questo articolo per gli esempi).

Senza alcuna estensione aggiuntiva, è possibile utilizzare il PostAsyncmetodo standard :

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

dove jsonInStringvalore puoi ottenere chiamandoJsonConvert.SerializeObject(<your object>);


1
Ma Microsoft.AspNet.WebApi.Client non assomiglia alla libreria ASP.NET Core RC2. E il secondo modo è davvero troppo di ripetizione del codice ((
Rem

@Rem perché non crei un HttpClient metodo di estensione ( PostAsJsonAsync) per utilizzare il secondo modo. Ti consente di evitare la ripetizione del codice.
Adem Caglin,

1
Sicuro. Ma ho fatto la domanda per scoprire se mi sto perdendo qualcosa. Non riesco a credere che non sia ancora stato implementato in Core!
Rem

1
Questa libreria non è una core / .net-standard, non credo che System.Net.Http.Formatting sia stato ancora portato
Chris S

1
Questo funzionerà per HttpClient creato da IHttpClientFactory in .NET Core 2.2 dal pacchetto nuget Microsoft.Extensions.Http. Tuttavia, come si fa in questo modo ma aggiungere intestazioni come una chiave di autorizzazione.
Nick Gallimore,

99

Uso questa classe:

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

Esempio di utilizzo:

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

5
Perché non un metodo di estensione? classe statica pubblica JsonContent {Task pubblico <?> PostAsJSonAsync (questo client HttpClient, oggetto a SerializeAsJson) {...}}
TamusJRoyce

2
Mi piace l'approccio di classe JsonContent
Marco Alves,

Questo imposta l' Content-Length:intestazione HTTP?
Vyacheslav Napadovsky,

1
@VyacheslavNapadovsky dipende dalle HttpClientimpostazioni, ad esempio se client.DefaultRequestHeaders.TransferEncodingChunked = true Content-Lengthun'intestazione impostata non sarebbe impostata e Transfer-Encoding: chunkedsarebbe invece impostata. Tuttavia, se si crea un client simile var client = new HttpClient();, Content-Lengthper impostazione predefinita l'intestazione verrà impostata per questa classe di contenuti.
stop-cran,

12

Aggiungerei alla risposta accettata che vorresti anche aggiungere l' Acceptintestazione a httpClient:

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

si, anche per me è richiesto, confermato tramite postino.
Weihui Guo,

1

Hai ragione, questo è stato implementato da tempo in .NET Core.

Al momento della stesura (settembre 2019), il project.jsonfile di NuGet 3.x + è stato sostituito da PackageReference(come spiegato in https://docs.microsoft.com/en-us/nuget/archive/project-json ).

Per ottenere l'accesso ai *Asyncmetodi della HttpClientclasse, il .csprojfile deve essere configurato correttamente.

Apri il tuo .csprojfile in un editor di testo semplice e assicurati che la prima riga sia
<Project Sdk="Microsoft.NET.Sdk.Web">
(come indicato in https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#the -csproj-format ).

Per accedere ai *Asyncmetodi della HttpClientclasse, devi anche avere il riferimento al pacchetto corretto nel tuo .csprojfile, in questo modo:

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

(Vedi https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference . Inoltre: si consigliano applicazioni destinate a ASP.NET Core 2.1 e successivamente utilizzare il metapacchetto Microsoft.AspNetCore.App , https://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage )

Metodi come PostAsJsonAsync, ReadAsAsync, PutAsJsonAsynce DeleteAsyncdovrebbe funzionare out of the box. (Non è necessaria la direttiva di utilizzo.)

Aggiornamento: il tag PackageReference non è più necessario in .NET Core 3.0.


Non sono riuscito a far funzionare PostAsJsonAsync con .NET Core 3.1. Grazie
Chris Kolenko il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.