Blazor Server 应用程序中进行 HTTP 请求 (4)

它们提供了一个单一的存储单元来配置特定的 HttpClient 并与之交互。例如,我们可以配置针对 Facebook API 的一个特定终端的一个类型化 HttpClient,而且该 HttpClient 可以封装使用该特定终端所需的所有逻辑。

它们与依赖注入 (DI) 一起使用,可以在需要的地方注入。

要配置类型化的 HTTPClient,我们需要在 Startup.cs 文件中使用相同的 AddHttpClient 方法注册它,但这一次,我们需要传递我们的服务名称 HolidaysApiService 作为它的类型。

Startup.cs

public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddServerSideBlazor(); services.AddSingleton<IHolidaysApiService, HolidaysApiService>(); services.AddHttpClient<HolidaysApiService>(); }

在上面的代码片段中,HTTP 客户端和我们的服务 HolidaysApiService 都将注册为瞬时客户端和服务。这将允许我们在服务的构造函数中传递 HttpClient,如以下代码片段所示。请注意,HttpClient 是如何公开为服务的 public 属性的。

HolidaysApiService.cs

public class HolidaysApiService : IHolidaysApiService { public HttpClient Client { get; } public HolidaysApiService(HttpClient client) { client.BaseAddress = new Uri("http://date.nager.at/"); client.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json"); Client = client; } public async Task<List<HolidayResponseModel>> GetHolidays(HolidayRequestModel holidaysRequest) { var result = new List<HolidayResponseModel>(); var url = string.Format("api/v2/PublicHolidays/{0}/{1}", holidaysRequest.Year, holidaysRequest.CountryCode); var response = await Client.GetAsync(url); if (response.IsSuccessStatusCode) { var stringResponse = await response.Content.ReadAsStringAsync(); result = JsonSerializer.Deserialize<List<HolidayResponseModel>>(stringResponse, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); } else { result = Array.Empty<HolidayResponseModel>().ToList(); } return result; } }

类型化客户端的配置也可以不在类型化客户端的构造函数中指定,而在注册期间在 Startup.cs 文件的 ConfigureServices 方法中指定。

Startup.cs

public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddServerSideBlazor(); services.AddHttpClient<IHolidaysApiService, HolidaysApiService>(c => { c.BaseAddress = new Uri("http://date.nager.at/"); c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json"); }); }

如果您使用的是这种方式,则无需单独注册您的服务。您可以从 ConfigureServices 方法中删除下面这行代码。

services.AddSingleton<IHolidaysApiService, HolidaysApiService>();

可以将 HttpClient 对象密封在一个类型化客户端中,而不公开为 public 属性。然后,我们可以在服务内部的任意方法中使用这个客户端。

public class HolidaysApiService : IHolidaysApiService { private readonly HttpClient _httpClient; public HolidaysApiService(HttpClient client) { _httpClient = client; } public async Task<List<HolidayResponseModel>> GetHolidays(HolidayRequestModel holidaysRequest) { var result = new List<HolidayResponseModel>(); var url = string.Format("api/v2/PublicHolidays/{0}/{1}", holidaysRequest.Year, holidaysRequest.CountryCode); var response = await _httpClient.GetAsync(url); if (response.IsSuccessStatusCode) { var stringResponse = await response.Content.ReadAsStringAsync(); result = JsonSerializer.Deserialize<List<HolidayResponseModel>>(stringResponse, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); } else { result = Array.Empty<HolidayResponseModel>().ToList(); } return result; } }

再次运行应用程序,并提供国家代码和年份值,您应该能够看到以下公共假期列表。

Using-HTTP-Client-to-Call-Third-Party-APIs-in-Blazor

总结

在本文中,我介绍了在 Blazor Server 应用程序中创建和使用 HTTP 客户端的不同技术。这里提到的大部分技术也可以在 ASP.NET Core 应用程序中使用,因为 Blazor Server 应用程序是构建在 ASP.NET Core 基础架构之上的。在我的下篇文章 《Making HTTP Requests in Blazor WebAssembly Apps》 中,我将尝试介绍 HTTP 客户端在 Blazor WebAssembly 应用程序中的创建和使用。


相关阅读:

Blazor Server 和 WebAssembly 应用程序入门指南

Blazor 组件入门指南

Blazor 数据绑定开发指南

Blazor 事件处理开发指南

Blazor 组件之间使用 EventCallback 进行通信

Blazor 路由及导航开发指南

Blazor 模板化组件开发指南

Blazor Server 应用程序中进行 HTTP 请求

作者 : Waqas Anwar
翻译 : 技术译站
链接 : 英文原文

https://www.ezzylearning.net/tutorial/making-http-requests-in-blazor-server-apps Making HTTP Requests in Blazor Server Apps

https://github.com/ezzylearning/BlazorServerWebAPIsDemo

https://date.nager.at/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgwjs.html