تغییرات API دات نت 5 از دیدگاه افزونههای HttpClient
در اینجا لیست کامل متدهای الحاقی اضافه شدهی به فضای نام جدید و استاندارد System.Net.Http.Json را مشاهده میکنید:
namespace System.Net.Http.Json { public static class HttpClientJsonExtensions { public static Task<object> GetFromJsonAsync(this HttpClient client, string requestUri, Type type, JsonSerializerOptions options, CancellationToken cancellationToken = default(CancellationToken)); public static Task<object> GetFromJsonAsync(this HttpClient client, string requestUri, Type type, CancellationToken cancellationToken = default(CancellationToken)); public static Task<object> GetFromJsonAsync(this HttpClient client, Uri requestUri, Type type, JsonSerializerOptions options, CancellationToken cancellationToken = default(CancellationToken)); public static Task<object> GetFromJsonAsync(this HttpClient client, Uri requestUri, Type type, CancellationToken cancellationToken = default(CancellationToken)); public static Task<TValue> GetFromJsonAsync<TValue>(this HttpClient client, string requestUri, JsonSerializerOptions options, CancellationToken cancellationToken = default(CancellationToken)); public static Task<TValue> GetFromJsonAsync<TValue>(this HttpClient client, string requestUri, CancellationToken cancellationToken = default(CancellationToken)); public static Task<TValue> GetFromJsonAsync<TValue>(this HttpClient client, Uri requestUri, JsonSerializerOptions options, CancellationToken cancellationToken = default(CancellationToken)); public static Task<TValue> GetFromJsonAsync<TValue>(this HttpClient client, Uri requestUri, CancellationToken cancellationToken = default(CancellationToken)); public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, string requestUri, TValue value, JsonSerializerOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, string requestUri, TValue value, CancellationToken cancellationToken); public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, Uri requestUri, TValue value, JsonSerializerOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); public static Task<HttpResponseMessage> PostAsJsonAsync<TValue>(this HttpClient client, Uri requestUri, TValue value, CancellationToken cancellationToken); public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, string requestUri, TValue value, JsonSerializerOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, string requestUri, TValue value, CancellationToken cancellationToken); public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, Uri requestUri, TValue value, JsonSerializerOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); public static Task<HttpResponseMessage> PutAsJsonAsync<TValue>(this HttpClient client, Uri requestUri, TValue value, CancellationToken cancellationToken); } public static class HttpContentJsonExtensions { public static Task<object> ReadFromJsonAsync(this HttpContent content, Type type, JsonSerializerOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); public static Task<T> ReadFromJsonAsync<T>(this HttpContent content, JsonSerializerOptions options = null, CancellationToken cancellationToken = default(CancellationToken)); } public sealed class JsonContent : HttpContent { public Type ObjectType { get; } public object Value { get; } public static JsonContent Create(object inputValue, Type inputType, MediaTypeHeaderValue mediaType = null, JsonSerializerOptions options = null); public static JsonContent Create<T>(T inputValue, MediaTypeHeaderValue mediaType = null, JsonSerializerOptions options = null); protected override void SerializeToStream(Stream stream, TransportContext context, CancellationToken cancellationToken); protected override Task SerializeToStreamAsync(Stream stream, TransportContext context); protected override Task SerializeToStreamAsync(Stream stream, TransportContext context, CancellationToken cancellationToken); protected override bool TryComputeLength(out long length); } }
متدهای الحاقی جدید کلاس HttpClientJsonExtensions
این متدها به صورت خلاصه شامل سه متد زیر میشوند:
- GetFromJsonAsync : یک درخواست Get را به آدرسی خاص ارسال کرده و خروجی JSON دریافتی را به کمک امکانات توکار System.Text.Json، پردازش و deserialize میکند.
- PostAsJsonAsync : یک درخواست POST را به آدرسی خاص، ارسال میکند. شیء ارسالی به آن به صورت خودکار به JSON تبدیل شده و سپس به سمت سرور ارسال میگردد.
- PutAsJsonAsync : یک درخواست PUT را به آدرسی خاص، ارسال میکند. شیء ارسالی به آن به صورت خودکار به JSON تبدیل شده و سپس به سمت سرور ارسال میگردد.
در ذیل چند مثال را در مورد نحوهی کار با این متدهای الحاقی جدید فضای نام استاندارد System.Net.Http.Json، مشاهده میکنید:
var httpClient = new HttpClient(); httpClient.BaseAddress = new Uri("https://localhost:5000"); var profiles = await httpClient.GetFromJsonAsync<Profile[]>("api/users/profiles"); var profile = new Profile { FirstName = "User 1", LastName = "Name 1", Age = 25 }; using var response1 = await httpClient.PostAsJsonAsync("api/users/profiles", profile); response1.EnsureSuccessStatusCode(); var updatedProfile = new Profile { FirstName = "User 2", LastName = "Name 2", Age = 40 }; using var response2 = await httpClient.PutAsJsonAsync("api/users/profiles", profile); response2.EnsureSuccessStatusCode();
اگر میخواستیم یک چنین کارهایی را پیش از دات نت 5 انجام دهیم، میبایستی قسمت Serialize کردن و همچنین تنظیم content-type را دستی انجام میدادیم:
var profile = new Profile { FirstName = "User 1", LastName = "Name 1", Age = 25 }; var json = JsonSerializer.Serialize(profile); var stringContent = new StringContent(json, Encoding.UTF8, "application/json"); using var response4 = await httpClient.PostAsync("api/users/profiles", stringContent); response4.EnsureSuccessStatusCode();
متدهای الحاقی جدید کلاس HttpContentJsonExtensions
این کلاس، متد الحاقی جدید ReadFromJsonAsync را ارائه میدهد که کار آن، خواندن یک محتوای HTTP از نوع HttpContent و deserialize آن به صورت JSON است. یک مثال:
var httpClient = new HttpClient(); httpClient.BaseAddress = new Uri("https://localhost:5000"); var request = new HttpRequestMessage(HttpMethod.Get, "api/users/profiles"); using var response1 = await httpClient.SendAsync(request); if (response1.IsSuccessStatusCode) { var profiles = await response1.Content.ReadFromJsonAsync<Profile[]>(); }
انجام اینکار در نگارشهای پیشین دات نت، نیاز به فراخوانی دستی JsonSerializer.DeserializeAsync را دارد:
var request = new HttpRequestMessage(HttpMethod.Get, "api/users/profiles"); using var response2 = await httpClient.SendAsync(request); if (response2.IsSuccessStatusCode) { using var streamResult = await response2.Content.ReadAsStreamAsync(); var profiles = JsonSerializer.DeserializeAsync<Profile[]>(streamResult); }
روشهای زیادی برای کار با HttpClient وجود دارند. یک روش آن، ساخت دستی HttpRequestMessage و سپس ارسال آن توسط متد SendAsync است؛ بجای استفاده از متد PostAsJsonAsync که بررسی شد. در این حالت با استفاده از متد جدید JsonContent.Create، میتوان کار تبدیل یک شیء را به JSON و همچنین تنظیم content-type را به صورت خودکار انجام داد:
var httpClient = new HttpClient(); var uri = "https://localhost:5000"; httpClient.BaseAddress = new Uri(uri); var requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://localhost:5000") { Content = JsonContent.Create(new Profile { FirstName = "User 1", LastName = "Name 1", Age = 25 }) }; using var reponse1 = await httpClient.SendAsync(requestMessage); reponse1.EnsureSuccessStatusCode();