翻译自 Waqas Anwar 2021年5月4日的文章 《Making HTTP Requests in Blazor Server Apps》
Blazor Server 应用使用标准的 ASP.NET Core 应用程序,在服务端执行 .NET 代码。在 Blazor Server 应用程序中,我们可以像在 ASP.NET Core Web 应用程序中那样,使用相同的方式访问任意 .NET 库或服务端功能。这其中的一项功能是,使用 HTTP Client 实例向第三方 Web API 发送 HTTP 请求。在本教程中,我将向您展示创建 HTTP Client 实例的不同方法。另外,我还会向您展示如何在 Blazor Server 应用程序中使用第三方 API 来获取和显示数据。
下载源码
第三方 Web API 概览我们将开发一个 Blazor Server 应用程序,该应用允许用户在 Blazor 页面组件上输入国家代码和年份,然后我们将调用第三方 API 以获取指定国家和年份的公共假期列表。我们使用的第三方 API 是 Nager.Date,它是一个全球公共假期 API。
这是一个非常简单的 API,您可以轻松地在 Postman 中输入以下 URL 测试此 API。
https://date.nager.at/api/v2/PublicHolidays/2021/CN
该 API 的响应是 JSON 格式的公共假期列表,如下所示:
从 Blazor Sever 应用程序开始在 Visual Studio 2019 中创建一个 Blazor Server 应用程序,并新建一个名为 Models 的文件夹。在 Models 文件夹中添加以下两个模型类,以映射上述 Holidays API 的请求和响应。
HolidayRequestModel.cs
public class HolidayRequestModel { public string CountryCode { get; set; } public int Year { get; set; } }HolidayResponseModel.cs
public class HolidayResponseModel { public string Name { get; set; } public string LocalName { get; set; } public DateTime? Date { get; set; } public string CountryCode { get; set; } public bool Global { get; set; } }接下来,在 Pages 文件夹中创建一个新的 Razor 组件 HolidaysExplorer.razor 及其代码隐藏文件 HolidaysExplorer.razor.cs。如果您想了解有关 Razor 组件和代码隐藏文件的更多知识,可以阅读我的文章《Blazor 组件入门指南》。
HolidaysExplorer.razor.cs
public partial class HolidaysExplorer { private HolidayRequestModel HolidaysModel = new HolidayRequestModel(); private List<HolidayResponseModel> Holidays = new List<HolidayResponseModel>(); [Inject] protected IHolidaysApiService HolidaysApiService { get; set; } private async Task HandleValidSubmit() { Holidays = await HolidaysApiService.GetHolidays(HolidaysModel); } }HolidaysModel 字段是 HolidayRequestModel 类的一个实例,它将帮助我们创建一个简单的表单来向用户询问国家代码和年份。下面的代码片段显示了使用 HolidaysModel 对象创建的 Blazor 表单,其中 HandleValidSubmit 方法是使用 Blazor Form 的 OnValidSubmit 事件配置的,用户提交表单时该方法将被调用。
<EditForm Model="@HolidaysModel" OnValidSubmit="@HandleValidSubmit"> <label>Country Code:</label> <InputText @bind-Value="HolidaysModel.CountryCode" /> <label>Year:</label> <InputNumber @bind-Value="HolidaysModel.Year" /> <button type="submit">Submit</button> </EditForm>Holidays 列表用来显示从第三方 API 返回的假期。我们需要使用一个 @foreach 循环迭代返回的假期来生成一个简单的 bootstrap 表格。
@if (Holidays.Count > 0) { <table> <thead> <tr> <th>Date</th> <th>Name</th> <th>Local Name</th> <th>Country Code</th> <th>Global</th> </tr> </thead> <tbody> @foreach (var item in Holidays) { <tr> <td>@item.Date.Value.ToShortDateString()</td> <td>@item.Name</td> <td>@item.LocalName</td> <td>@item.CountryCode</td> <td>@item.Global</td> </tr> } </tbody> </table> }HolidaysExplorer.razor 视图的完整代码如下: