Senden Sie eine HTTP-POST-Nachricht in ASP.NET Core mit HttpClient PostAsJsonAsync


141

Ich möchte dynamisches Objekt wie senden

new { x = 1, y = 2 };

als Hauptteil der HTTP-POST-Nachricht. Also versuche ich zu schreiben

var client = new HttpClient();

aber ich kann keine Methode finden

client.PostAsJsonAsync()

Also habe ich versucht, das Paket Microsoft.AspNetCore.Http.Extensions zu project.json hinzuzufügen und hinzuzufügen

using Microsoft.AspNetCore.Http.Extensions; 

Klausel zu verwenden. Es hat mir jedoch nicht geholfen.

Was ist der einfachste Weg, um eine POST-Anfrage mit JSON-Body in ASP.NET Core zu senden?


Antworten:


202

Sie sollten einen Verweis auf das Paket "Microsoft.AspNet.WebApi.Client" hinzufügen (Beispiele finden Sie in diesem Artikel ).

Ohne zusätzliche Erweiterung können Sie die Standardmethode PostAsyncverwenden:

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

Wo jsonInStringWert können Sie durch Anruf erhaltenJsonConvert.SerializeObject(<your object>);


1
Microsoft.AspNet.WebApi.Client sieht jedoch nicht wie eine ASP.NET Core RC2-Bibliothek aus. Und der zweite Weg ist wirklich zu viel Code-Wiederholung ((
Rem

@Rem, warum erstellen Sie keine HttpClient Erweiterungsmethode ( PostAsJsonAsync), um den zweiten Weg zu verwenden ? Dies ermöglicht es Ihnen, Code-Wiederholungen zu vermeiden.
Adem Caglin

1
Sicher. Aber ich habe die Frage gestellt, um herauszufinden, ob mir etwas fehlt. Ich kann nicht glauben, dass es noch nicht in Core implementiert wurde!
Rem

1
Diese Bibliothek ist kein Core / .net-Standard, ich glaube nicht, dass System.Net.Http.Formatting noch portiert wurde
Chris S

1
Dies funktioniert für HttpClient, der von IHttpClientFactory in .NET Core 2.2 aus dem Nuget-Paket Microsoft.Extensions.Http erstellt wurde. Wie machen Sie das auf diese Weise, aber fügen Sie Header wie einen Autorisierungsschlüssel hinzu.
Nick Gallimore

97

Ich benutze diese Klasse:

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

Verwendungsbeispiel:

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

5
Warum nicht eine Erweiterungsmethode? öffentliche statische Klasse JsonContent {public Task <?> PostAsJSonAsync (dieser HttpClient-Client, Objekt toSerializeAsJson) {...}}
TamusJRoyce

2
Ich mag den JsonContent-Klassenansatz
Marco Alves

Setzt dies den Content-Length:HTTP-Header?
Vyacheslav Napadovsky

1
@VyacheslavNapadovsky hängt von den HttpClientEinstellungen ab, z. B. ob ein gesetzter client.DefaultRequestHeaders.TransferEncodingChunked = true Content-LengthHeader nicht gesetzt Transfer-Encoding: chunkedwürde und stattdessen gesetzt würde. Wenn man den Client jedoch wie erstellt var client = new HttpClient();, wird der Header Content-Lengthstandardmäßig für diese Inhaltsklasse festgelegt.
Stop-Cran

12

Ich würde der akzeptierten Antwort hinzufügen, dass Sie auch den AcceptHeader zum httpClient:

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

Ja, für mich ist dies auch erforderlich, bestätigt durch die Verwendung eines Postboten.
Weihui Guo

0

Sie haben Recht, dass dies in .NET Core längst implementiert ist.

Zum Zeitpunkt des Schreibens (September 2019) wurde die project.jsonDatei von NuGet 3.x + durch ersetzt PackageReference(wie unter https://docs.microsoft.com/en-us/nuget/archive/project-json erläutert ).

Um auf die *AsyncMethoden der HttpClientKlasse zugreifen zu können , .csprojmuss Ihre Datei korrekt konfiguriert sein.

Öffnen Sie Ihre .csprojDatei in einem Nur-Text-Editor und stellen Sie sicher, dass die erste Zeile
<Project Sdk="Microsoft.NET.Sdk.Web">
(wie unter https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#the angegeben) angezeigt wird -csproj-Format ).

Um auf die *AsyncMethoden der HttpClientKlasse zugreifen zu können , müssen Sie außerdem die richtige Paketreferenz in Ihrer .csprojDatei haben, wie folgt:

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

(Siehe https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference . Außerdem: Wir empfehlen Anwendungen für ASP.NET Core 2.1 und Verwenden Sie später das Microsoft.AspNetCore.App-Metapaket ( https://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage ).

Methoden wie PostAsJsonAsync, ReadAsAsync, PutAsJsonAsyncund DeleteAsyncjetzt der Box funktionieren sollen. (Keine Verwendung der Direktive erforderlich.)

Update: Das PackageReference-Tag wird in .NET Core 3.0 nicht mehr benötigt.


Ich konnte PostAsJsonAsync nicht dazu bringen, mit .NET Core 3.1 zu arbeiten. Danke
Chris Kolenko
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.