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.