Saya ingin mengirim objek dinamis seperti
new { x = 1, y = 2 };
sebagai isi pesan HTTP POST. Jadi saya mencoba menulis
var client = new HttpClient();
tetapi saya tidak dapat menemukan metode
client.PostAsJsonAsync()
Jadi saya mencoba menambahkan paket Microsoft.AspNetCore.Http.Extensions ke project.json dan menambahkan
using Microsoft.AspNetCore.Http.Extensions;
menggunakan klausa. Namun itu tidak membantu saya.
Jadi apa cara termudah untuk mengirim permintaan POST dengan tubuh JSON di ASP.NET Core?
Jawaban:
Anda harus menambahkan referensi ke paket "Microsoft.AspNet.WebApi.Client" (baca artikel ini untuk mengetahui contoh).
Tanpa ekstensi tambahan, Anda dapat menggunakan
PostAsync
metode standar :client.PostAsync(uri, new StringContent(jsonInString, Encoding.UTF8, "application/json"));
di mana
jsonInString
nilai yang bisa Anda dapatkan dengan meneleponJsonConvert.SerializeObject(<your object>);
sumber
HttpClient
metode ekstensi (PostAsJsonAsync
) untuk menggunakan cara kedua. Ini memungkinkan Anda untuk menghindari pengulangan kode.Saya menggunakan kelas ini:
public class JsonContent : StringContent { public JsonContent(object obj) : base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json") { } }
Contoh penggunaan:
new HttpClient().PostAsync("http://...", new JsonContent(new { x = 1, y = 2 }));
sumber
Content-Length:
header HTTP?HttpClient
pengaturan, misalnya jika satu setclient.DefaultRequestHeaders.TransferEncodingChunked = true
Content-Length
header tidak akan ditetapkan danTransfer-Encoding: chunked
akan ditetapkan sebagai gantinya. Namun, jika seseorang membuat klien seperti ituvar client = new HttpClient();
, headerContent-Length
akan disetel untuk kelas konten ini secara default.Saya akan menambahkan jawaban yang diterima bahwa Anda juga ingin menambahkan
Accept
tajuk kehttpClient
:httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
sumber
Microsoft sekarang merekomendasikan penggunaan
IHttpClientFactory
dengan manfaat berikut:HttpClient
instance logis . Misalnya, klien bernama github dapat didaftarkan dan dikonfigurasi untuk mengakses GitHub. Klien default dapat didaftarkan untuk akses umum.HttpClient
. Menyediakan ekstensi untuk middleware berbasis Polly untuk memanfaatkan pendelegasian penangan dalamHttpClient
.HttpClientMessageHandler
instance yang mendasarinya . Manajemen otomatis menghindari masalah DNS (Domain Name System) umum yang terjadi saat mengelolaHttpClient
masa pakai secara manual .ILogger
) untuk semua permintaan yang dikirim melalui klien yang dibuat oleh pabrik.https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1
Mendirikan:
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { services.AddHttpClient(); // Remaining code deleted for brevity.
Contoh POST:
public class BasicUsageModel : PageModel { private readonly IHttpClientFactory _clientFactory; public BasicUsageModel(IHttpClientFactory clientFactory) { _clientFactory = clientFactory; } public async Task CreateItemAsync(TodoItem todoItem) { var todoItemJson = new StringContent( JsonSerializer.Serialize(todoItem, _jsonSerializerOptions), Encoding.UTF8, "application/json"); var httpClient = _clientFactory.CreateClient(); using var httpResponse = await httpClient.PostAsync("/api/TodoItems", todoItemJson); httpResponse.EnsureSuccessStatusCode(); }
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1#make-post-put-and-delete-requests
sumber
Anda benar bahwa ini telah lama diterapkan di .NET Core.
Pada saat penulisan (September 2019),
project.json
file NuGet 3.x + telah digantikan olehPackageReference
(sebagaimana dijelaskan di https://docs.microsoft.com/en-us/nuget/archive/project-json ).Untuk mendapatkan akses ke
*Async
metodeHttpClient
kelas,.csproj
file Anda harus dikonfigurasi dengan benar.Buka
.csproj
file Anda di editor teks biasa, dan pastikan baris pertama adalah<Project Sdk="Microsoft.NET.Sdk.Web">
(seperti yang ditunjukkan di https://docs.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#the -csproj-format ).
Untuk mendapatkan akses ke
*Async
metodeHttpClient
kelas, Anda juga harus memiliki referensi paket yang benar di.csproj
file Anda , seperti:<ItemGroup> <!-- ... --> <PackageReference Include="Microsoft.AspNetCore.App" /> <!-- ... --> </ItemGroup>
(Lihat https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#adding-a-packagereference . Selain itu: Kami merekomendasikan aplikasi yang menargetkan ASP.NET Core 2.1 dan nanti gunakan metapackage Microsoft.AspNetCore.App , https://docs.microsoft.com/en-us/aspnet/core/fundamentals/metapackage )
Metode seperti
PostAsJsonAsync
,ReadAsAsync
,PutAsJsonAsync
danDeleteAsync
sekarang harus bekerja di luar kotak. (Tidak perlu menggunakan direktif.)Pembaruan: Tag PackageReference tidak lagi diperlukan di .NET Core 3.0.
sumber