提供操作和功能

Objective

After completing this lesson, you will be able to 声明并实施域特定的自定义操作

CDS 中的建模操作和功能

以前,我们讨论了事件处理程序之前之后的示例。现在,我们来看看处理器 的用例。

处理程序上的 实际上可以满足请求,例如,通过从数据库读取数据或向数据库写入数据。在我们的示例中,我们希望使用 on 处理器实施域特定的自定义操作。

观看视频,了解 CAP 如何支持实施域特定的自定义操作。

注意

SAP 建议首选未绑定操作/函数,因为这些操作更易于实施和调用。

例如,我们希望为 CatalogService 实施名为 submitOrder 的未绑定操作。它用于下订单(以非常简化的方式)。我们在服务定义中声明此操作,如下图所示。

submitOrder 操作具有两个内向参数。第一个参数 book 用于标识要排序的工作簿。使用导入域模型中定义的"工作簿"实体中的"ID"元素的数据类型来键入参数。

第二个参数 quantity 的类型为 Integer,并指定要订购的项目数。

具有名为 stock 的属性的 对象定义为响应类型。此属性使用"工作簿"域模型实体中 stock 元素的数据类型键入。在执行订单后,属性的值应该是书的新股票。

注意

有关在 CDS 模型中定义未绑定和绑定操作和函数的更多示例,请参阅 CAP 文档

接下来,我们来看看如何实施声明的 submitOrder 操作。

实施操作/功能

操作和函数可在事件处理程序中实现。操作和功能的处理器与我们已经用于 CRUD 事件的事件处理器非常相似。

我们在 CatalogService 实施类的 init() 方法中为未绑定的 submitOrder 操作注册 on 处理程序(请参阅下图)。为此,我们通过 this.on() 调用继承的 on() 方法。

在所示示例中,我们将指定的函数 this.reduceStock 注册为 submitOrder 操作的实现。为此,将操作的名称作为第一个参数传递到 on() 方法,并将 函数作为第二个参数传递。我们将在下一节更详细地介绍 reduceStock 函数的实施。

注意

有关如何为绑定操作/函数注册处理器的信息,请参阅 CAP 文档

初步方法实施

实施 reduceStock 方法的想法如下。

我们根据数据库中的传递数量更新订购账簿的库存,并通过 操作的退货参数返回更新的库存。

将执行以下验证:

  • 传递数量必须大于或等于 1。
  • 传递的工作簿标识必须存在于数据库中。
  • 账面库存必须大于或等于订购数量。

如果其中一个验证失败,则应发出错误消息。

要实施此逻辑,我们需要访问数据库。但是,在下一课之前,我们不会学习如何执行此操作。因此,我们将在此限制使用 reduceStock 方法的不完整、初步实施(见下图)。

首先,我们通过重组分配将 Books 实体的 CSN 定义分配给 Books 常量。稍后,我们将使用此常量访问数据库。

在处理器,接收一个 cds.Request 实例作为参数。在所示示例中,我们调用了参数 reqreq 对象的数据属性用于访问参数 book 的值和操作的数量。我们在此处使用重组分配将传递的值分配到固定账簿数量

如果传递的数量小于 1,则使用 req.error() 方法发出相应的错误消息。

目前,我们只返回 10 作为更新库存。我们稍后将对此进行相应调整。

注意

作为在 处理程序上注册 的替代方法,还可以将操作和函数作为服务实施类上的传统 JavaScript 方法实施。然后,方法名称必须与操作/函数的名称匹配。然后,SubmitOrder 操作的实施将如下所示:

JavaScript
1234567891011121314
class CatalogService extends cds.ApplicationService { submitOrder(book, quantity) { const { Books } = this.entities; if (quantity < 1) { return req.error('The quantity must be at least 1.'); } let stock = 10; return { stock }; } }

此类操作/函数的方法式实施未在 init() 方法中注册。

调用操作/功能

通过 API 编程使用

可以在编码中调用操作和函数。CAP 为此编程用途提供了两个不同的选项:通用 API 和类型化 API。对于后者,Node.js 为生成的服务实例提供其名称和参数与服务模型中操作/功能的声明相对应的特定方法。这些自动生成的方法提供了调用操作/函数的便捷方式。

注意

操作/函数的编程使用示例可在 CAP 文档中找到。

HTTP 请求

还可以通过 HTTP 请求直接访问操作和功能。函数通过 GET 请求调用,而操作通过 POST 请求进行寻址。

例如,调用未绑定 submitOrder 操作的 HTTP 请求可能如下所示:

Code Snippet
1234567
POST <service_url>/submitOrder Content-Type: application/json { "book": "0ec991dc-95c5-4d8f-91e6-f81a92744781", "quantity": 2 }

注意

有关调用未绑定和绑定操作/函数的 HTTP 请求的更多示例,请参阅 CAP 文档

演示和练习:定义并实施自定义操作

注意

在练习中,在 SAP Business Application Studio 中自行执行以下演示中的分步说明。

作为练习的起点,如果您已成功完成之前练习在事件处理器之后提供的结果,请使用该练习的结果。或者,您还可以使用以下 GitHub 资源库中的分支 12_.after_event_handler 作为起点:

https://github.com/SAP-samples/cap-development-learning-journey

可在 GitHub 资源库的 13_custom_action 分支中找到模拟的完整实施。

有关资源库内容及其使用方法的详细信息,可在此处找到。

观看视频,了解如何定义并实施自定义操作。