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?

Rem
quelle
Ich
frage

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>);

einstellen
quelle
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 }));
Stop-Cran
quelle
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"));
Serj Sagan
quelle
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.

Henke
quelle
Ich konnte PostAsJsonAsync nicht dazu bringen, mit .NET Core 3.1 zu arbeiten. Danke
Chris Kolenko