Enviar mensaje HTTP POST en ASP.NET Core usando HttpClient PostAsJsonAsync


143

Quiero enviar objetos dinámicos como

new { x = 1, y = 2 };

como cuerpo del mensaje HTTP POST. Entonces trato de escribir

var client = new HttpClient();

pero no puedo encontrar el método

client.PostAsJsonAsync()

Así que intenté agregar el paquete Microsoft.AspNetCore.Http.Extensions a project.json y agregar

using Microsoft.AspNetCore.Http.Extensions; 

a la cláusula de usos. Sin embargo, no me ayudó.

Entonces, ¿cuál es la forma más fácil de enviar una solicitud POST con el cuerpo JSON en ASP.NET Core?


Respuestas:


206

Debe agregar una referencia al paquete "Microsoft.AspNet.WebApi.Client" (lea este artículo para ver ejemplos).

Sin ninguna extensión adicional, puede usar el PostAsyncmétodo estándar :

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

donde jsonInStringvalor puede obtener llamandoJsonConvert.SerializeObject(<your object>);


1
Pero Microsoft.AspNet.WebApi.Client no se parece a la biblioteca ASP.NET Core RC2. Y la segunda forma es realmente demasiada repetición de código ((
Rem

@Rem, ¿por qué no creas un HttpClient método de extensión ( PostAsJsonAsync) para usar la segunda forma? Le permite evitar la repetición de código.
adem caglin

1
Por supuesto. Pero hice la pregunta para descubrir si me estoy perdiendo algo. ¡No puedo creer que aún no se haya implementado en Core!
Rem

1
Esta biblioteca no es estándar / .net-standard, no creo que System.Net.Http.Formatting haya sido portada todavía
Chris S

1
Esto funcionará para HttpClient creado por IHttpClientFactory en .NET Core 2.2 desde el paquete nuget Microsoft.Extensions.Http. Sin embargo, ¿cómo lo hace de esta manera pero agrega encabezados como una clave de autorización?
Nick Gallimore

99

Yo uso esta clase:

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

Muestra de uso:

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

55
¿Por qué no un método de extensión? public static class JsonContent {public Task <?> PostAsJSonAsync (este cliente HttpClient, objeto toSerializeAsJson) {...}}
TamusJRoyce

2
Me gusta el enfoque de clase de JsonContent
Marco Alves el

¿Esto establece el Content-Length:encabezado HTTP?
Vyacheslav Napadovsky

1
@VyacheslavNapadovsky depende de la HttpClientconfiguración, por ejemplo, si un client.DefaultRequestHeaders.TransferEncodingChunked = true Content-Lengthencabezado establecido no se establecería y Transfer-Encoding: chunkedse establecería en su lugar. Sin embargo, si uno crea el cliente como var client = new HttpClient();, el encabezado Content-Lengthse establecerá para esta clase de contenido de forma predeterminada.
Stop-Cran

12

Agregaría a la respuesta aceptada que también desearía agregar el Acceptencabezado a httpClient:

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

sí, para mí esto también es obligatorio, confirmado mediante el uso de cartero.
Weihui Guo

1

Tiene razón en que esto se ha implementado desde hace mucho tiempo en .NET Core.

Al momento de escribir (septiembre de 2019), el project.jsonarchivo de NuGet 3.x + ha sido reemplazado por PackageReference(como se explica en https://docs.microsoft.com/en-us/nuget/archive/project-json ).

Para obtener acceso a los *Asyncmétodos de la HttpClientclase, su .csprojarchivo debe estar configurado correctamente.

Abra su .csprojarchivo en un editor de texto plano y asegúrese de que la primera línea sea
<Project Sdk="Microsoft.NET.Sdk.Web">
(como se señala en https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#the -csproj-format ).

Para obtener acceso a los *Asyncmétodos de la HttpClientclase, también debe tener la referencia de paquete correcta en su .csprojarchivo, así:

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

(Consulte https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference . Además: Recomendamos aplicaciones dirigidas a ASP.NET Core 2.1 y luego use el metapaquete Microsoft.AspNetCore.App , https://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage )

Los métodos como PostAsJsonAsync, ReadAsAsync, PutAsJsonAsyncy DeleteAsyncahora deben trabajar fuera de la caja. (No se necesita usar la directiva).

Actualización: la etiqueta PackageReference ya no es necesaria en .NET Core 3.0.


No pude lograr que PostAsJsonAsync funcionara con .NET Core 3.1. Gracias
Chris Kolenko
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.