如何使用 C# 创建酒店房间可用性日历
一段解决实际问题的代码演练
引言
想象一下,您管理着一家名为 The Quirky Koala Inn 的小型酒店。您有几个房间可以预订。您收到的众多电话咨询之一是某个房间是否可以预订。这些咨询可能需要时间,因此您希望限制电话咨询的数量,除非是预订。因此,您希望在您的网站、应用程序或第三方网站上向潜在客人展示房间可用性。
在本文中,我们将介绍如何为 The Quirky Koala Inn 实现一个 Minimal WebApi。在后续的文章中,我们将扩展功能,并展示如何将 WebApi 连接到 MVC 网站和其他地方。
背景
我花了几年时间开发“Sticky Guest”,这是一个酒店经理可以用来管理预订、客人、账户等的平台。并非所有酒店都需要如此复杂的功能,这里有一种方法可以供任何酒店业主用来构建简单的功能,以改善客人的体验。
要求
我们受托为 The Quirky Koala Inn 解决这个问题。与经理讨论后,我们提出了以下要求:
- 创建房间可用性数据库。
- 创建一个 WebApi 服务来访问可用性。
- 创建一个网站或应用程序来使用 WebApi 向潜在客人展示房间可用性。(第一部分未涵盖)
- 创建一个管理门户,以便可以调整房间可用性(第一部分未涵盖)
我已将代码的 ZIP 文件附加到本文。您可以解压并在 Visual Studio 2022 中打开,或者一起编写代码。
第一部分:构建 WebApi 端点
我们将使用 Visual Studio 2022(编辑 - CodeProject 不允许外部链接,因此我已删除此内容。您可以通过搜索引擎搜索“Visual Studio 2022 下载”来找到下载。这将引导您访问 Microsoft 网站。不要将其与“Visual Studio Code”混淆,后者是不同的产品,不适用于本教程!)来创建项目,Microsoft 网站提供了免费和付费版本。
注意 - 确保在安装 Visual Studio 2022 时,选择 ASP.NET 和 Web 开发工作负载。否则,您将缺少我们将使用的选项。
1.1 创建解决方案和 WebApi 项目
完成时,我们将有多个项目位于同一个解决方案中。最初设置好这一点最容易,否则您以后需要重命名项目、命名空间和变量。一个解决方案包含许多相关的项目。
启动 Visual Studio 2022,选择 **文件** > **创建新项目**。
搜索 **空白解决方案**,然后点击 **下一步**。
在 **配置新项目** 下,将 **解决方案名称** 输入为 TheQuirkyKoalaInn
,然后点击 **创建**。
将创建一个新的空解决方案。
Visual Studio 2022 没有 **文件** > **创建新解决方案** 的选项,因此我们必须使用此解决方法**。
我们现在将创建 WebApi 和支持项目。
右键单击 **解决方案资源管理器** 中的 **解决方案**,然后选择 **添加新项目**。在搜索框中,输入“**ASP.NET Core Empty**”,选择项目模板,然后点击 **下一步**。
在配置中,将项目名称输入为 TheQuirkyKoalaInnWebApi
。确保位置位于解决方案的子文件夹中,例如 TheQuirkyKoalaInn\TheQuirkyKoalaInn\TheQuirkyKoalaInnWebApi。随着更多项目的添加,这一点将变得很重要。点击 **下一步**。
在 **其他信息** 下,选择 **框架** “**.NET 7**”,然后点击 **创建**。项目将随后创建。
通过选择 **调试** > **开始调试** 或按 **F5** 来检查项目是否运行。项目编译后,它应该会启动一个浏览器,显示“**Hello World!**”。
注意 - 根据您在 Visual Studio 中的设置,它可能会提示您是否要信任预先构建的 SSL 证书。您应该单击“是”,然后再次单击“是”以在本地安装安全证书。如果您稍后将项目部署到服务器,我们期望服务器具有 SSL 证书,允许通过 HTTPS 而不是 HTTP 进行加密调用。在我们部署网站供公众访问之前,我们不需要关心这个问题。
关闭浏览器,项目将停止运行。
如果打开项目中创建的 Program.cs 文件,我们会发现以下内容:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
行:
app.MapGet("/", () => "Hello World!");
这表明当我们导航到网站的 "/"
时,我们将执行此代码。在此示例中,我们返回一个 string
"Hello World!"
。我们想添加一个新条目,以便在我们导航到它时返回我们的房间可用性日历。让我们将代码更改为:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.MapGet("/calendar", () =>
{
return "todo calendar";
});
app.Run();
现在,当我们启动应用程序(**F5**)并导航到 /calendar 时,我们将收到“**todo calendar**”。这就是我们将要编写新代码的地方。
"/"
和 "/calendar"
都称为**端点**。每次我们想添加新功能时,都会添加一个新的端点。我们称之为端点,因为它是一个结束客户端的起点。如果我们颠倒过来,从 API 的角度来看,它是代码末尾一个可以访问的点。这里的教训是,命名事物是困难的。
我们现在需要一种方法来存储房间可用性,以便将其展示给客人。我们将使用数据库和模型来完成此操作。
1.2 构建数据库和模型
我们想存储酒店经理设置的房间可用性。然后,当客人访问网站时,可以检索并显示该信息。为此,我们将创建一个简单的数据库。该数据库存储房间及其可用性的表示。我们无法在数据库中保留实际房间,因此我们保留房间的表示,我们称之为模型。模型代表了现实世界中的事物。
我们将为此数据库和模型创建一个新项目。这允许我们以后在其他项目中重复使用它,而无需复制代码。我们希望避免代码的多个副本。
右键单击 **解决方案**,然后选择 **添加 > 新项目**,就像我们之前所做的那样。选择 **类库(.NET 或 .NET Framework)** 选项(不要与类库(.NET Framework)混淆,我们不需要后者)。
点击**下一步**。
对于 **配置新项目**,将项目名称输入为 TheQuirkyKoalaInnDbClassLibrary
,并确保子文件夹设置为 TheQuirkyKoalaInn\TheQuirkyKoalaInn\TheQuirkyKoalaInnDbClassLibrary。
在此处注意到文件夹结构是值得的,因为主解决方案位于主文件夹中。然后每个项目都在自己的子文件夹中。这很有帮助,因为它允许我们重用项目并保持其简单。如果我们开始使用源代码管理,它会备份我们的更改,除此之外,我们还需要每个项目都在主项目下的自己的子文件夹中。
项目存在的位置的边界并不总是清晰的,因为它取决于上下文。在这种情况下,我们知道我们希望在多个其他项目中都使用数据库项目(TheQuirkyKoalaInnDbClassLibrary)
,因此它必须位于自己的独立项目中。
点击 **下一步**。在“其他信息”下,选择 **.NET 7**,然后点击 **创建** 以创建项目。
项目将与一个名为 Class1.cs 的默认空类一起创建。我们将创建自己的类,因此右键单击 **解决方案资源管理器** 中的 Class1.cs 文件,然后从菜单中选择 **删除**。
数据传输对象 (DTO)
我们还需要另一个项目来存放我们的数据传输对象 (DTO)。这些对象用于将数据发送到客户端和从客户端接收数据。没有这些对象,我们将不得不把数据库对象发送给客户端。这可能会导致安全问题,向客户端暴露我们可能不想发送的额外信息。它也简化了客户端的代码,因为他们不必担心数据库的内部结构。
右键单击 **解决方案**,然后选择 **添加 > 新项目**,就像我们之前所做的那样。选择 **类库(.NET 或 .NET Framework)** 选项。
对于 **配置新项目**,将项目名称输入为 TheQuirkyKoalaInnDtoClassLibrary
,并确保子文件夹设置为 TheQuirkyKoalaInn\TheQuirkyKoalaInn\TheQuirkyKoalaInnDtoClassLibrary。
使用与之前相同的设置创建项目,并删除默认的 Class1.cs。
您最终应该得到一个如下所示的解决方案:
添加数据库代码
我们现在将为项目创建代码。
我们要模拟一个 Room
,所以我们来创建它。右键单击 TheQuirkyKoalaInnDbClassLibrary
项目,然后选择 **添加 > 类**。将类的名称输入为 Room.cs,然后点击 **添加**。
用以下代码替换默认创建的代码:
namespace TheQuirkyKoalaInnDbClassLibrary
{
public class Room
{
public string? Name { get; set; }
public string? Availability { get; set; }
}
}
Name
将成为房间的名称。
Availability
将代表一系列字符,用于定义房间在一段时间内的可用性。**"1"** 表示开放日期,而 **"0"** 表示房间已预订。这里有其他表示 Availability
的方法。例如,我们可以使用布尔数组。但是,string
可以更容易地看出发生了什么,并且如果将来我们想将其保存到真实数据库中,也会更容易。这在一定程度上是个人选择。
我们还需要一个类来存储所有房间,因为我们会有不止一个。我们还需要一个类来存储所有这些对象。所以我们将为这两者创建一个新的 Db
类。右键单击 TheQuirkyKoalaInnDbClassLibrary
项目,然后选择 **添加 > 类**。将类的名称输入为 Db.cs,然后点击 **添加**。
用以下代码替换默认创建的代码:
namespace TheQuirkyKoalaInnDbClassLibrary
{
public class Db
{
public List<Room> RoomList { get; set; }
public DateOnly AvailabilityStartDateData { get; set; }
public Db()
{
AvailabilityStartDateData = DateOnly.FromDateTime(DateTime.Now);
RoomList = new List<Room>
{
new Room()
{
Name = "Room 1 - Double",
Availability = "1100111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
111111111111111111111111"
},
new Room()
{
Name = "Room 2 - Double",
Availability = "1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
111111111111111111111111"
},
new Room()
{
Name = "Room 3 - Executive",
Availability = "1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
111111111111111111111111"
},
new Room()
{
Name = "Room 3 - Single",
Availability = "1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
1111111111111111111111111111111111111111111111111111
111111111111111111111111"
}
};
}
}
}
List<Room> RoomList
为我们提供了一个包含多个房间的列表。我们将为我们的酒店创建三个房间。
DateOnly AvailabilityStartDateData
将告诉我们房间可用性的开始日期。如果设置为 5 月 1 日,那么 Availability
中的第一个字符将代表 5 月 1 日,第二个字符代表 5 月 2 日,依此类推。
构造函数 public Db()
会创建酒店房间并填充一些可用性测试数据。当我们启动应用程序时,这会自动调用,数据将被填充并准备好供我们使用。
添加 Dto 代码
我们现在将创建 Dto
项目(TheQuirkyKoalaInnDtoClassLibrary
)的代码。
我们希望能够从数据库房间模型对象创建一个 Dto
对象。默认情况下,一个项目不知道另一个项目。如果我们尝试引用 TheQuirkyKoalaInnDbClassLibrary
项目中的类,它将生成一个错误:
找不到类型或命名空间名称“XYZ”(您是否缺少 using 指令或程序集引用?).
我们需要添加对相关项目的引用来解决这个问题。为此,右键单击 TheQuirkyKoalaInnDtoClassLibrary
项目,然后选择 **添加 > 项目引用**。
将出现“引用管理器”。勾选 TheQuirkyKoalaInnDbClassLibrary
项目,然后点击 **确定**。
TheQuirkyKoalaInnDtoClassLibrary
项目现在将能够访问 TheQuirkyKoalaInnDbClassLibrary
项目中标记为 Public
的任何类。
我们需要一个 RoomDto
,所以我们来创建它。右键单击 TheQuirkyKoalaInnDtoClassLibrary
项目,然后选择 **添加 > 类**。将类的名称输入为 RoomDto.cs,然后点击 **添加**。
用以下代码替换默认创建的代码:
using TheQuirkyKoalaInnDbClassLibrary;
namespace TheQuirkyKoalaInnDtoClassLibrary
{
public class RoomDto
{
public string? Name { get; set; }
public string? Availability { get; set; }
public RoomDto() { }
public RoomDto(Room room, DateOnly availabilityStartDate, DateOnly getFromDate)
{
if (String.IsNullOrEmpty(room.Availability))
throw new ArgumentNullException(nameof(room.Availability));
int startIndex =
(int)(getFromDate.DayNumber - availabilityStartDate.DayNumber);
if (startIndex > 365 - 30) startIndex = 365 - 30;
if (startIndex < 0) startIndex = 0;
this.Name = room.Name;
this.Availability = room.Availability.Substring(startIndex, 30);
}
}
}
Name
是房间的名称,与数据库中的一样。
Availability
与之前的 string
相同,只是起始日期将取决于酒店客人的需求。例如,我们的数据库可能存储从 5 月 1 日开始的房间可用性,但我们的客人可能想查看 5 月 14 日。我们不想将完整的可用性传输到客户端设备,因此我们将从 5 月 14 日开始传输。
这里的代码很有趣:
public RoomDto(Room room, DateOnly availabilityStartDate, DateOnly getFromDate)
这会从一个 room
对象创建一个 RoomDto
对象。为了实现这一点,我们还需要知道 room.Availability
(availabilityStartDate
)的开始日期是什么,以及我们想返回的日期范围(getFromDate
)。然后我们将返回任意 30 天的房间可用性。
这行代码允许我们引用 TheQuirkyKoalaInnDbClassLibrary
项目。
using TheQuirkyKoalaInnDbClassLibrary;
我们将让客人能够一次检索多个房间。这是我们的一种假设,因为它取决于客户端应用程序的需求。当我们有一个房间、日期和可用性集合时,称之为 Calendar
似乎是合理的。我们将把这个封装到一个 CalendarDto
对象中。
让我们创建一个 CalendarDto
。右键单击 TheQuirkyKoalaInnDtoClassLibrary
项目,然后选择 **添加 > 类**。将类的名称输入为 CalendarDto.cs,然后点击 **添加**。
用以下代码替换默认创建的代码:
namespace TheQuirkyKoalaInnDtoClassLibrary
{
public class CalendarDto
{
public List<RoomDto>? RoomList { get; set; }
public DateOnly AvailabilityStartDateData { get; set; }
}
}
List<RoomDto>? RoomList
是我们包含可用性的 Room
列表。
DateOnly AvailabilityStartDateData
是日历的开始日期。
现在我们需要将其与 WebApi 连接起来。
添加 WebApi 代码
有了所有这些准备就绪,我们现在可以在 WebApi 项目(TheQuirkyKoalaInnWebApi
)中添加代码,以将日历返回给客户端。
TheQuirkyKoalaInnWebApi
项目需要使用其他两个项目中的代码。与之前一样,我们需要添加项目引用。为此,右键单击 TheQuirkyKoalaInnWebApi
项目,选择 **添加 > 项目引用**。然后勾选 TheQuirkyKoalaInnDtoClassLibrary
和 TheQuirkyKoalaInnDbClassLibrary
项目。点击 **确定** 保存。
然后编辑 Program.cs 文件,并将代码替换为:
using TheQuirkyKoalaInnDbClassLibrary;
using TheQuirkyKoalaInnDtoClassLibrary;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSingleton<Db>();
var app = builder.Build();
// /calendar/2023-4-28
app.MapGet("/calendar/{date?}", (DateOnly? date, Db db) =>
{
date = date ?? DateOnly.FromDateTime(DateTime.Now);
var cal = new CalendarDto
{
AvailabilityStartDateData = (DateOnly)date,
RoomList = new List<RoomDto>()
};
foreach (var room in db.RoomList)
{
cal.RoomList.Add(new RoomDto
(room, db.AvailabilityStartDateData, (DateOnly)date));
}
return cal;
});
app.MapGet("/", () =>
{
return "Hello World";
});
app.Run();
我们正在使用*依赖注入*来创建数据库(Db
)类的实例,如下所示:
builder.Services.AddSingleton<Db>();
单例表示我们想要该类的单个实例。否则,我们将创建多个不同的数据库类。我们现在可能可以接受,因为我们只是读取数据。当我们以后想保存数据时,这将导致问题,因为我们会将数据保存到哪一个实例?我们不知道。想象一下把一盘意大利面条掉在地板上,然后用筷子捡起来。
我们在这里为酒店创建一个端点,当我们传入一个 date
时,我们希望获得一个 CalendarDto
。
app.MapGet("/calendar/{date?}", (DateOnly? date, Db db) =>
参数 Db db
由我们上面定义的依赖注入处理。如果我们创建了更多端点,我们将以类似的方式传递数据库。客户端无需担心,甚至无需了解这一点。
{date?}
中的 **?** 表示该参数是可选的。如果客户端没有传入日期,那么我们将假定他们想要从今天的日期开始的日历,如下所示:
date = date ?? DateOnly.FromDateTime(DateTime.Now);
在这里,我们正在创建一个 CalendarDto
实例,准备返回:
var cal = new CalendarDto
{ AvailabilityStartDateData = (DateOnly)date, RoomList = new List<RoomDto>() };
处理将在返回给客户端之前完成:
foreach (var room in db.RoomList)
{
cal.RoomList.Add(new RoomDto(room, db.AvailabilityStartDateData, (DateOnly)date));
}
在这里,我们利用了之前创建的 Dto 构造函数方法,该方法将数据库的 Room 转换为 RoomDto
。
测试 WebApi
如果一切顺利,我们应该能够测试我们所做的。由于我们只在 API 中使用 Get
方法,我们可以在浏览器中测试它。如果我们有更复杂的方法,我们需要使用 Postman 桌面应用程序之类的东西。
按 **F5** 启动应用程序,然后导航到日历 URL,例如 https://:7031/calendar。
默认情况下,数据以 JSON 格式显示。这是一种人类可读的格式,更容易看出发生了什么。
{
"roomList": [
{
"name": "Room 1 - Double",
"availability": "110011111111111111111111111111"
},
{
"name": "Room 2 - Double",
"availability": "111111111111111111111111111111"
},
{
"name": "Room 3 - Executive",
"availability": "111111111111111111111111111111"
},
{
"name": "Room 3 - Single",
"availability": "111111111111111111111111111111"
}
],
"availabilityStartDateData": "2023-05-04"
}
在这里,我们以客户端应用程序的方式调用 WebApi,并获取房间可用性。这可以用于网站、应用程序或我们可能想要使用的任何其他服务。
在下一部分,我们将设置一个网站来展示它的实际运行情况。
历史
- 2023 年 5 月 5 日 - 移除了外部网站链接,以符合 CP 文章要求。
- 2023 年 5 月 4 日 - 初稿完成,第一版编辑完成,提交。
- 2023 年 5 月 3 日 - 开始撰写初稿。
- 2023 年 5 月 2 日 - 编码。