1. 控制台程序
我们将使用一个控制台应用程序,用于整合各种中间件,也是一样的方式。
数据库链接地址和账户密码登不能直接写到代码里面,所以需要添加读取 配置文件的支持。
在编辑器中,选择文件以打开它。
将以下 配置块添加到 元素下方的根 元素中。 此配置将在项目中包含新文件,并将其复制到输出文件夹。 此块中的指令可以确保在应用时将应用配置文件放在输出目录中。
现已添加用于启用读取配置所需的库,我们需要在控制台应用程序中启用该功能。在编辑器中,选择,将文件的内容替换为以下代码。
① 连接
添加对 缓存 客户端的支持。
接下来,将控制台应用程序配置为使用适用于 的 客户端。
② 连接
③ 连接
2.
本模块使用。 通过在首选命令终端中运行以下命令,确保你已安装 :
将显示类似于以下示例的输出:
确保列出了以 开头的版本。 如果未列出任何版本或未找到命令,请。
① 创建并浏览 项目
默认使用 保护 项目, 包含 开发证书。 该证书是作为首次运行体验的一部分安装的。
例如: 会生成以下输出的变体:
安装 会将 开发证书安装到本地用户证书存储。 该证书已安装,但它不受信任。 若要信任该证书,请执行一次性步骤,以运行 工具:
下面的命令提供有关 工具的帮助:
② 执行运行项目。
上述命令:
- 在当前目录中找到项目文件。
- 检索并安装此项目所需的任何项目依赖项。
- 编译项目代码。
- 使用 服务器将 托管在 和 终结点中。
创建项目时,将为 选择 到 端口,为 选择 到 端口。 通过编辑项目的 文件,可以轻松更改开发过程中使用的端口。 本模块使用以 开头的安全 URL。
应获得类似于以下内容的输出,用于指示应用正在运行:
如果你是在自己的计算机上运行此应用,可以将浏览器指向输出中显示的 链接(在上例中为 )以查看生成的页面。 请记住此端口,因为在使用 的整个模块中将一直使用它。
③ 打开 Web 浏览器并转到:
应会看到类似于这个示例的 输出:
④ 使用 文件进行测试接口
项目中包含的文件为 ,该文件用于通过标准格式测试 终结点。 多个 都支持 文件,包括 以及安装了 客户端扩展的 内部。
-
打开 文件。
此文件已预配置了 变量和调用 的 GET 命令,该命令接受。
-
选择 上方的命令,该命令会将请求发送到正在运行的服务。
调用此命令将打开一个响应窗口,其输出与我们在浏览器中看到的以下内容类似:
你创建了一个 应用程序,用于提供示例天气预报数据,然后,你使用了 与该应用程序交互。
示例方案
假设你是一家名为 的披萨公司的员工。 经理要求你为披萨库存管理开发一个 服务,作为公司 店面和移动应用程序的必备组件。 该服务必须支持添加、查看、修改和删除披萨类型; 谓词的标准化使用方式,也称为创建、读取、更新、删除 ()。
在深入探讨如何编写自己的 类之前,让我们先看一下 示例中的代码,了解它的工作原理。 在本单元中,你将了解 如何在几十行代码中使用 基类和几个 属性来生成正常工作的 。 了解这些概念后,便可以编写自己的 类了。
以下是整个 类的代码。 如果你还不明白,请不要担心。 现在来逐步完成这一过程。
控制器是一个公共类,具有一个或多个称为的公共方法。 按照惯例,控制器放在项目根目录的 目录中。 操作通过路由被公开为 终结点。 因此,对 的 HTTP 请求将执行 类的 方法。
首先要注意的是,此类继承自 基类。 这个基类提供了许多用于处理 请求的标准功能,让你可以专注于应用程序的特定业务逻辑。
如果你在 中开发过 或模型-视图-控制器 体系结构,那么你已使用过 类。 不要通过从 类派生来创建 控制器。 派生自 ,并添加了对视图的支持,因此它用于处理网页,而不是 请求。
有两个重要属性应用到了 ,如以下代码所示:
启用固定行为,使生成 更加容易。 一些行为包括参数源推理、将属性路由作为一项要求以及模型验证错误处理增强功能。
定义路由模式 。 令牌替换为用控制器的名称(不区分大小写,无 后缀)。 此控制器处理对 的请求。
路由可能包含静态字符串,如 中所示。 在此示例中,此控制器将处理对 的请求。
包括由 属性指定的单个控制器操作。 此属性将 请求路由到 方法。 如你所见,在上一个练习中,向 发出请求会导致返回天气预报结果。
本模块的后面部分会介绍其他常见操作与执行 操作(、、、)的 相关联。 但 控制器只需要实现一个控制器操作。
在本例中,你将获取返回的 的完整列表。 操作还允许通过传递标识符来检索单个项。 在 中,可以使用 特性检索单个项。 在下一练习中将实现该属性。
⑤ 现在,你已了解了 控制器的基本组件,现在可以创建自己的 类了。
在开始为披萨实现 之前,需要添加一个数据存储供你执行操作。
你需要一个 类来表示库存中的披萨。 模型包含用于表示披萨特征的属性。 模型用于在 中传递数据,以及在数据存储中保存披萨选项。
在本单元中,该数据存储是一个简单的本地内存中缓存服务。 在实际应用程序中,可以考虑将数据库(例如 )与 结合使用。
1. 创建披萨模型
将以下代码添加到并保存所做的更改。 此类定义披萨。
2. 添加数据服务
将以下代码添加到并保存所做的更改。 此代码创建内存中披萨数据服务。
默认情况下,此服务提供一个简单的内存中数据缓存服务,其中包含两个披萨。 我们的 使用该服务进行演示。 如果先停止再启动 ,内存中数据缓存会重置为的构造函数中的两个默认披萨。
⑥ 运行以生成应用:生成成功,且没有任何警告。 如果生成失败,请检查输出以获取故障排除信息。
控制器是一个公共类,具有一个或多个称为的公共方法。 按照惯例,控制器放在项目根目录的 目录中。 这些操作在 控制器内公开为 终结点。
添加控制器
在 中选择 文件夹,并添加名为 的新文件。
如前文所述,此类派生自 ,后者是 中用于处理 请求的基类。 它还包含你已经了解的两个标准属性,即 和 。 如前文所述, 属性定义了到 令牌的映射。 由于此控制器类名为 ,因此该控制器处理对 的请求。
获取所有披萨
需要实现的第一个 谓词是 ,使用该谓词,客户端可以从 获取所有披萨。 可使用内置 属性来定义从服务返回披萨的方法。
将 中的 注释替换为以下代码:
上一个操作:
- 仅响应 HTTP 谓词,如 属性所示。
- 返回类型为 的 实例。 类型是 中所有操作结果的基类。
- 查询服务以获取所有披萨,并通过 的值 自动返回数据。
3. 检索单种披萨
客户端可能还需要请求获取特定披萨而非整个列表的相关信息。 你可以实现另一个 操作,此操作需要 参数。 可使用内置 属性来定义从服务返回披萨的方法。 路由逻辑将 (没有 )和 (具有 )注册为两个不同的路由。 然后,你可以编写一个单独的操作来检索单个项。
将 中的 注释替换为以下代码:
上一个操作:
- 仅响应 HTTP 谓词,如 属性所示。
- 要求 之后的 URL 段中包含 参数的值。 请记住,控制器级别的 属性定义了模式。
- 查询数据库以获取与所提供的 参数匹配的披萨。
上述操作中使用的每个 实例都映射到下表中对应的 状态代码:
4. 生成并运行新控制器
运行以下命令,生成并启动 :
5. 使用 文件测试控制器
- 打开
- 添加新的 以在 ### 分隔符下调用 终结点:
我们的披萨服务支持对披萨列表执行 操作。 这些操作是通过 谓词执行的,它们通过 属性进行映射。 正如你所了解的, 谓词用于从服务检索一个或多个项。 此类操作使用 属性进行批注。
下表显示了你为披萨服务实现的四个操作的映射:
你已经了解了 操作的工作原理。 让我们来详细了解一下 、 和 操作。
POST
为了使用户能够将新项添加到终结点,必须通过使用 属性来实现 操作。 将项(在此示例中是披萨)作为参数传递入方法时, 会自动将发送到终结点的任何 转换为填充的 对象。
以下是 方法的方法签名,你将在下一节中实现该方法:
属性使用 方法映射发送到 的 HTTP 请求。 此方法并不像我们在 方法中看到的那样返回披萨列表,而是返回 响应。
可让客户端知道请求是否成功,并提供新创建的披萨的 。 使用标准 状态代码,因此,无论客户端使用哪种语言或者在哪个平台上运行,它都能轻松地与客户端集成。
幸运的是, 具有一些实用工具方法,它们可为你创建适当的 响应代码和消息。
PUT
修改或更新库存中的披萨类似于我们实现的 方法,但它使用 属性并接受 参数以及需要更新的 对象:
上述操作中使用的每个 实例都映射到下表中对应的 状态代码:
展开表
DELETE
可实现的一种更简单的操作是 操作,该操作只接受要从内存中缓存中删除的披萨的 参数:
上述操作中使用的每个 实例都映射到下表中对应的 状态代码:
我们来继续扩展 控制器,添加在库存中创建 ()、更新 () 和删除 () 披萨的功能。
添加披萨
让我们使用 方法通过 添加披萨。
使用以下代码替换 中的 注释:
上一个操作:
- 仅响应 HTTP 谓词,如 属性所示。
- 将请求正文的 对象插入到内存中缓存。
由于控制器使用 属性进行批注,因此意味着将在请求正文中找到 参数。
方法调用中的第一个参数表示操作名称。 关键字用于避免对操作名称进行硬编码。 使用操作名称来生成 响应标头,该标头包含新创建的披萨的 。
修改披萨
现在,让我们使用 方法通过 更新披萨。
使用以下代码替换 中的 注释:
上一个操作:
- 仅响应 HTTP PUT 谓词,如 属性所示。
- 要求 之后的 URL 段中包含 参数的值。
- 返回 ,因为在运行时之前, 返回类型未知。 、 和 方法分别返回 、 和 类型。
由于控制器批注通过 属性进行,因此暗示着将在请求正文中找到 参数。
删除披萨
最后,让我们使用 方法通过 Web API 移除披萨。
使用以下代码替换 中的 注释:
上一个操作:
- 仅响应 HTTP 谓词,如 属性所示。
- 要求 之后的 URL 段中包含 参数的值。
- 返回 ,因为在运行时之前, 返回类型未知。 和 方法分别返回 和 类型。
- 查询内存中缓存以获取与所提供的 参数匹配的披萨。
在继续操作之前,请记得保存 文件。
运行以下命令,生成并启动 :
最后测试文档如下: