这大概是大家都在等待的篇章。在本章中,本书将解释适用于 SAP HANA XSA 的 Node JS 开发。这里详细讨论了各种端点和 HTTP 方法,以处理来自正在构建的微服务练习的请求和响应。系好安全带,我们出发吧。
在第 1 章,介绍了 REST APIs 的定义。成功开发的最重要因素之一是理解 REST APIs 的区别以及何时以及如何使用它们。创建 REST APIs 是为了通过 HTTP(s)方法公开和接收数据(表 4-1 )。使用 REST APIs 的另一个好处是允许这些 API 的消费者访问来自企业的数据,而无需直接访问数据库。REST API 的使用者必须知道使用 API 的 URL、所需的身份验证、提供给 API 的预期数据结构、从 API 返回的任何响应结构以及可能的错误消息。
表 4-1
HTTP 方法
|HTTP 方法
|
何时使用它
| | --- | --- | | 得到 | 读出数据 | | 发布/上传 | 插入/更新数据 | | 删除 | 是的,你猜对了 | | 选择 | 预检选项–服务器将响应是否接受发送带有这些参数的请求 |
大多数 REST 实现都是从使用 GET 方法开始的(之前在 POSTMAN 一节中也有描述和展示)。在本节中,首先在 HANA XSA 应用中创建 Node JS 模块。打开 SAP Web IDE。请注意 mta.yaml 文件,因为随着附加模块的创建或模块依赖关系的更新,该文件可能需要手动干预。到目前为止,数据库开发只有一个模块( db 模块)。然而,由于开始使用后端模块,所以理解模块依赖性以及为什么和在哪里进行下一组更新是很重要的。
在 SAP Web IDE 中,右键单击项目,选择新建,然后选择 Node.js 模块,如图 4-1 所示。
图 4-1
创建 Node.js 模块
做出选择后,按照向导步骤进行操作。调用 Node JS 模块 api ,因为它将代表 REST API(图 4-2 )。
图 4-2
模块名
继续提供模块设置(如版本 1.0.0 ),因为这是初始步骤,并启用 XSJS 支持,因为它在上一小节中已提到并显示在图 4-3 中。
图 4-3
Node.js 模块设置
点击下一步确认或者直接点击完成,如图 4-4 所示。
图 4-4
模块创建的确认
向导完成这一步后,可以在 Web IDE 中看到创建并添加到项目中的 api 模块。此外,打开 mta.yaml 文件将在 wavepress 应用中显示该模块的新条目,如图 4-5 所示。
图 4-5
模块创建后的 mta yaml 文件
现在,有一个 Node 模块具有一些默认设置,如 XSJS 兼容模式和一些由 IDE 创建的默认文件。
在大多数涉及 Node JS 的软件开发中,也会找到 package.json 文件。该文件包含关于 Node 依赖关系的信息、模块的元数据、模块开始时要运行的文件,以及在项目开发期间可以设置的任何单元测试文件,如图 4-6 所示。仅当包含或删除了其他依赖项时,才会更新此文件。
图 4-6
Node.js 模块中的 package.json 文件
目前,默认的 Node JS 模块是一个基本文件,可以不加修改地运行;必须构建并运行该模块。建议在进行其他开发之前先构建模块,以确保可以构建当前模块,并且可以从 npm 软件包管理器下载任何依赖项。下载的一些依赖项将是开源的,一些将是@sap 模块。
由于是第一次构建该模块(图 4-7 ,可能需要几秒钟的时间来下载依赖项并在系统中创建 Node 应用。如果 npm 模块下载失败,请分析控制台窗口以查看诸如模块版本不正确或未找到之类的消息,或者查看 npm 站点是否可访问。SAP Web IDE 正在尝试从互联网下载一些模块,这将需要访问外部 URL。
图 4-7
模块构建
在这里收到成功消息意味着模块构建成功。如果收到错误,则必须在继续之前进行分析。此时可能发生的一些错误可能是由于未找到 npm 模块依赖关系版本或未下载 npm 模块。阅读控制台输出错误,以查看可能出现的错误。在对 npm 模块或版本进行更改后,请在继续之前重复重建过程以获得成功的构建。如果 XSA 环境托管在云提供商上,则该环境可能需要额外的权限才能从 npm 或外部包管理器连接和下载内容。如果出现这些问题,请联系环境管理员,以确保可以正确连接到外部资源。
如果构建成功,在 Web IDE 控制台中将出现以下消息,并显示“completed successfully ”,如图 4-8 所示。
图 4-8
模块构建后的控制台输出
通过右键单击 api 模块来运行它,选择 Run,然后选择 Run as Node.js Application。SAP Web IDE 将尝试运行如图 4-9 所示的应用。
图 4-9
运行 Node.js 应用
如果运行,控制台窗口将显示该模块从哪个 URI 位置运行——主机:51026——如图 4-10 所示。
图 4-10
构建和运行 Node.js 模块后的控制台输出
模块开始运行后,控制台窗口将显示一些消息。这个输出是在哪里以及如何产生的?
在 Node 模块中,有一个名为 package.json 的文件。这是在构建和运行 Node JS 应用期间使用的 json 文件。在包文件中,有一个包含 脚本 文件夹的部分,该文件夹还包含一个名为开始的命令。该命令调用 server.js 文件。
如图 4-11 所示,server.js 文件是 REST API 中 Node 模块的入口点。请参见图中第 18、25 和 31 行的控制台日志语句。这些语句在 SAP Web IDE 的控制台窗口中生成输出。
图 4-11
server.js 文件
今后更详细地检查这个文件是很重要的。
最初的第 4 行和第 5 行需要 SAP registry 提供的相关 Node 模块。
从第 8 行开始的 options 对象表示将不使用身份验证(anonymous: true),最终它将被重定向到/index.xsjs 文件。在开发的这个阶段,可以看到兼容模式在起作用。
在第 15–19 行配置 SAP HANA 和第 22–26 行配置 UAA 服务时,会分配一些其他选项。请记住,目前还没有配置 UAA 服务实例,因此在启动 api 模块时,对于映射到 API 模块的 URL,不会出现身份验证提示。
在第 29 行,控制台输出显示了运行模块时最初收到的内容。
如上所述,控制台上列出的主机和端口是运行 Node 应用的端口。单击它将启动作为 API 模块运行的后端 REST API,从第 11 行可以看到重定向到 XSJS 兼容模式。index.xsjs 文件的输出如图 4-12 所示。
图 4-12
浏览器的 Hello World 输出
生成该输出的 XSJS 代码如图 4-13 所示。
图 4-13
XSJS 代码
由于这个 Node 模块正在开发中,所以从后端系统(或管理视图)来查看这个应用可能会有所帮助。例如,这对于分析如何分配或消耗内存非常有用。
使用具有适当凭证的帐户,访问该视图,并通过转到 SAP Web IDE 工具菜单并选择 SAP HANA XS 高级驾驶舱选项来打开 SAP HANA XS 高级驾驶舱。图 4-14 显示了驾驶舱的着陆页面。记住 CF/XS 高级架构层次结构,导航至应用。
从 XSA 驾驶舱,从组织开始,导航到空间(图 4-14 )。找到在这个空间下运行的微服务(如图 4-15 和 4-16 中的应用)。
图 4-16
XSA 驾驶舱内的应用
图 4-15
SAP SAP XSA 共享空间
图 4-14
SAP HANA XSA 驾驶舱
如果部署的应用是微服务,如何进行验证?
验证从最初的构建(只有一个数据库模块)开始,现在随着额外的微服务(api 模块)的创建而发生。这是真实的,因为列出了多个过程。此外,每个(微服务)流程可以彼此独立地扩展、部署、启动或停止,如图 4-17 所示。
当深入应用时,可以看到以下内容。注意控制台输出中显示的一个熟悉的端口;它也显示在这个屏幕上(端口 51026)。
随着我们继续构建更多的应用,来自 CF 和 XS 的概念将开始彼此相似。
图 4-17
XSA 驾驶舱中显示的应用设置
暂时离开驾驶舱,返回 SAP Web IDE,继续构建 API。保持 XSJS 代码不变,并继续在 Node JS 端构建。
回想一下,构建 API 允许与 SAP HANA 数据库表进行交互,并通过调用 SQL 脚本查询公开数据。从 REST API 中保存和删除数据将通过调用展示不同集成方法的存储过程来实现。
SAP HANA XSA 环境的兼容模式允许从 HANA 1 进行 XSJS 开发并且不准备将其开发迁移到 HANA 2 高级架构的现有客户继续运行和支持应用,就像在 XS 经典架构中所做的那样。SAP HANA 1 中使用的 XS 应用是 SAP HANA 数据库和 XS 应用在同一环境中共存的应用。此外,云铸造原则不适用于这些应用。这种类型的场景将被简要解释,然而,对于本书的上下文,将显示使用 XS 高级架构和 XS 高级支持的 Node JS 语言创建 REST APIs 的重点。
重要的是要提到这两种架构之间的特征差异,如表 4-2 所示,这样,如果需要分析和比较公司 It 基础架构的当前状态和未来状态,就可以做出明智的决策。
表 4-2
XSJS 兼容模式与 XSA
|XSJS 兼容模式
|
XS 高级应用(NodeJS、Java、Python)
| | --- | --- | | 单线程应用(和单片) | 可以独立运行的微服务 | | 它的性能取决于整个系统的进程 | 可以独立扩容(向上和向下) | | 使用 XSJS 和$。蜜蜂 | 由于 BYOL(自带语言),可以利用来自外部包管理器和其他编程语言的 Node JS、Python 和其他模块 | | 使用 HANA Studio 或 SAP Web IDE 进行开发 | 可以使用 SAP Web IDE 或其他带有附加插件的外部 IDE | | 同步编程 | 异步、非阻塞编程 | | OData V2 | OData V4 |
如何启用 XSJS 兼容模式?很简单。创建 Node JS 模块时,向导会显示一个复选框,创建 Node JS 模块时需要选中该复选框,如图 4-18 所示。
图 4-18
创建 Node JS 模块时启用 XSJS 支持
按照向导步骤完成模块创建,并在 XSA 环境中查找 XSJS 文件以与兼容模式进行交互。兼容模式的起始 XSJS 文件位于 api/lib/index.xsjs,如图 4-19 所示。
图 4-19
兼容模式下使用的 XSJS 文件
随着 API 构建的进展,Express 等成熟的 Node JS 框架将用于创建 API 端点。快速框架在第 1 章第 1.2 节中有所描述。这是首选框架之一,因为它易于使用,具有很好的社区采用度(来自 SAP 内部和外部),文档清晰,并且在 Node JS 开发中很容易创建 REST APIs。
要继续开发,请在 package.json 文件中添加 Express framework 的依赖项。所需的其他依赖项包括 HANA 数据库模块(查询将针对该模块运行)、XS 环境、XS 安全性、任何问题的日志记录,以及 Passport 模块(将在使用 UAA 身份验证和令牌生成时使用)。
包文件现在看起来如图 4-20 所示。
图 4-20
Node.js 模块中的 package.json 文件
在 server.js 文件中,继续进行一些更新以初始化 Express,配置中间件,能够将参数传递到框架中,并向 Node js 服务发出请求。遵循模块化和最佳实践,决定将路由(来自请求)和服务实现分离为单独的模块。这一段代码是 SAP 常用的,也出现在一些 SAP 教程网站上,如图 4-21 所示。
图 4-21
SAP 教程中的示例代码
注意,在 server.js 文件中,Express 模块被初始化。除了 Express 模块,还包括其他 Node 和 SAP 模块。当初始化快速模块时,与 SAP XSA 环境和 HDB 客户端等相关的设置将被初始化。在初始化 Express 之后,它将作为一个参数传递给路由(第 18 行)。路由(处理来自 xs-app.json 文件的路由的进程)将用于处理服务器端的 API 请求,执行过程将从 Express 框架传递到处理任何 JavaScript 逻辑的特定 Node JS 文件或函数,执行该文件或函数是为了处理请求、验证业务逻辑、调用任何数据库工件,并最终向请求者返回响应。
匿名身份验证已被删除,以使用 UAA 服务强制执行身份验证过程。XSA 有三种类型的身份验证:无、基本和路由。“无”意味着 API 将是完全开放的,不会受到攻击。基本意味着用户提供用户名和密码。简单认证基本认证可以;但是,它不如路由身份验证可靠。
路由身份验证是首选方法,因为它遵循应用于 UAA 服务和 JSON Web 令牌(JWT)的最佳实践。UAA 方法将在 api 模块中演示。通过 UAA 服务的身份验证是 CF 架构的一部分,这也是这里展示它的主要原因。
继续再次构建 api 模块,并查看图 4-22 中是否显示了与任何附加依赖项相关的任何错误。继续下一步之前,请确保模块构建正确。
如果显示任何与依赖项相关的错误,请通过访问 npm 站点或确保 package.json 文件具有正确的语法来确保模块版本正确。确保 SAP Web IDE 可以连接到 npm。这里可能需要环境管理员的帮助。
图 4-22
构建 Node.js 模块后的控制台输出
构建模块后,确保正确下载了指定的 Node 模块。打开应用的 api 模块,验证 api/node_modules 文件夹中是否存在 Node 依赖,如图 4-23 所示。
每次该模块的构建被触发并成功完成时,package.json 文件中列出的依赖项将用于下载或更新任何指定的依赖项(以及它们的子依赖项)。每个下载的模块都包含自己的 package.json 文件,该文件包含该模块自己的依赖项、元数据和与该模块相关的其他属性。打开模块的 package.json 文件以查看其版本下载,并确保它与 api 模块的包 json 中的指定版本相匹配。
node_modules 文件夹应该类似于图 4-23 (为了节省空间,对图像进行了裁剪,大约有 30-40 个非 sap 模块)。
图 4-23
添加到包文件中并下载到项目中的 node_modules
模块构建完成后,运行它并仔细观察接下来会发生什么。右键单击 api 模块并选择运行。
几秒钟后,控制台消息显示模块正在运行。控制台中显示的是和以前一样的主机:51026;但是,如果点击该 URL,浏览器窗口将显示运行时错误信息,如图 4-24 所示。
图 4-24
在模块初始化期间启用 UAA 检查后,浏览器出现运行时错误
尽管由于显示的消息,此消息可能会对模块是否正在运行给出错误的判断,但请通过打开 XSA 驾驶舱并导航至应用页面来验证 api 模块的请求状态。请注意,应用实际上正在运行,如图 4-25 所示。
图 4-25
从 XSA 驾驶舱运行的应用视图
这是一个正确的实现,并且显示的消息是有效的。由于 api 将利用 UAA 认证,它将进一步要求路由认证,并且必须声明导航路由。(导航)路线是在 UI 模块中声明的。
创建一个新模块,并声明这两个模块之间的依赖关系(在 mta yaml 中)。
右键单击项目,选择 New,然后选择 SAPUI5 HTML5 Module,按照提示将其添加到 wavepress 项目中,如图 4-26 所示。
图 4-26
从 SAP Web IDE 创建 SAPUI5 HTML5 模块
添加模块名称。请记住,在添加其他模块时,这个模块部分也会添加到 mta yaml 文件中。不久之后,这个模块将需要被添加为 api 模块依赖项之一,以便它能够提供到 api 后端的路线导航。
如果要构建前端用户界面,则命名空间非常有用。本例中使用项目名称作为命名空间,如图 4-27 所示。
图 4-27
创建 HTML5 模块后的名称空间提示
SAPUI5 是一个现代的 UI 框架,它使用 MVC(模型-视图-控制器)软件设计模式。从 SAP Web IDE 创建此模块时,请提供其中一个 UI (XML)视图的名称。默认情况下,向导指定 View1 作为其名称,但如果需要,可以将其更改为另一个名称。允许 JavaScript 和 HTML 视图类型;然而,SAP 建议使用 XML 视图,因为这些类型的视图遵循结构化的层次结构,使得它们更容易在图形编辑器中可视化和表示(图 4-28 )。
图 4-28
SAPUI5 视图名称提示
完成此步骤后,单击下一步并确认或完成。
当新的 HTML5 模块被添加到项目中时,它将如图 4-29 所示。在这个步骤中,一个常见的错误是创建了文件夹,导致错误阻止了模块的构建。
如果创建了文件夹,应用将无法工作。请务必使用新的{特定}模块向导来创建这些模块。添加完新创建的模块后,右键点击并构建 ui 模块,如图 4-29 和 4-30 所示。
图 4-30
构建 HTML5 模块后的控制台输出
图 4-29
新添加的 HTML5 模块
成功构建后,再次右键单击它,将其作为 web 应用运行,如图 4-31 所示。
图 4-31
将 HTML5 模块作为 web 应用运行
单击控制台输出窗口顶部显示的 host:51027 URL。空的 SAPUI5 应用将在下一个选项卡上启动。这个 SAPUI5 应用使用默认的 SAPUI5 主题和默认版本。
此时,如图 4-32 所示,验证 ui 模块是否运行,没有其他内容。
图 4-32
运行 SAPUI5 HTML5 模块后浏览器中的默认 UI 代码
这还不是 API。因为 UI 是 API 的入口点,所以需要更新应用设置来将这两个模块链接在一起。打开 mta yaml 文件,查看它是如何更新的。
三个模块应显示在 mta yaml 文件的图形编辑器中,因为这些是目前为止创建的模块,如图 4-33 所示。
图 4-33
显示项目内部模块的 mta 文件
为了从浏览器中清除 api 错误,按照以下步骤添加 wavepress 模块依赖关系(按照创建的顺序),如图 4-34 所示:
图 4-34
从 mta yaml 文件中看到的 db 模块依赖关系
- db 模块(db 模块中的属性应该已经正确存在)
-
需要 hdi_db 容器
-
需要跨架构服务
-
图 4-35
从 mta yaml 文件看到的 api 模块依赖关系
- api 模块(图 4-35
-
需要 db 和 hdi_db 容器,以便与它们进行交互
-
需要 UAA 服务的实例来验证(HTTP)请求
-
(向其他模块)提供要从外部(例如,从 ui)调用的资源
-
图 4-36
从 mta yaml 文件中看到的 ui 模块依赖关系
- ui 模块(图 4-36
-
要求 UAA 服务对 API 请求进行身份验证
-
需要 api 资源来转发请求和令牌
-
在再次构建模块之前,验证 XSA 驾驶舱是否提供了服务,以确保创建新的 UAA 服务实例。
前(如图 4-37 ):
图 4-37
从 XSA 驾驶舱显示的服务实例
建立新的 ui 模块(并重建 api 模块)和图 4-38 后。
图 4-38
在项目中重建不同模块后显示的控制台输出
新创建的 XS UAA 服务的服务实例出现在 XSA 驾驶舱中,如图 4-39 所示。
图 4-39
在项目中重建模块后运行的服务实例
已经创建了 UAA 服务的一个实例(图 4-40 ,模块将使用它来建立它们的关系和依赖关系。还没有映射允许从 UI 访问 wavepress REST API 的路由。由于应用最终将需要 UAA 身份验证,后端模块将无法直接访问。这是在软件系统中禁止 API 消费者直接访问后端服务的一种正常而安全的方式。相反,应用需要公开 ui 模块。使用 ui 模块的重新路由配置和路由认证流,来自浏览器的传入请求将从 ui 模块传递到 REST API。这些是云铸造原则,而不是 SAP HANA XSA。
图 4-40
在开发空间内运行的应用
下一步是在 ui 模块内的 xs-app.json 文件中指定路由和身份验证方法。默认情况下,该文件如图 4-41 所示。
图 4-41
REST API 的 xs-app.json 文件配置设置
编辑该文件,并将 认证方法 属性设置为 route。
添加 API 将要使用的 路线 (图 4-42 )。
图 4-42
xs-json 文件,包括路由和验证方法
-
第一条路线是导航到 Node JS REST API(沿着路径 /wpsvc )。
-
第二条路线是导航到 XSJS 向后兼容模式服务(在 api 模块初始构建期间构建的第一个服务)。
-
第三条路线是“捕获所有路线”,它将 ui 从任何未指定的路线重新路由到 webapp/index.html 文件,也称为 welcomeFile。
如果您想要处理不同的 API 端点,请继续添加路由。路线从更具体到不太具体进行匹配。源/目的地的路由设置可能会使用正则表达式,以防您需要处理各种类似的路由。
在项目的这一点上,有许多信息需要仔细分析和理解:
-
路由是一个 URL(它可能包含一个端口号)和它所指向的相对路径(也称为根和端点)。
-
每条路线都包含
-
来源–它是如何进入系统的
-
目的地–使用 mta,有针对性的重新路由
-
csrfProtection–跨站请求防伪
-
authenticationType–使用创建的 xsuaa 实例,如 yaml 文件中定义的那样
-
添加完依赖连接后,重新构建并重新运行 api 和 ui 模块。如果构建成功,如图 4-43 所示,从 ui 模块所在的根 URL 导航,并将相对路径更改为标识为 /wpsvc 的(api 端点)默认 api 路径。
运行 REST API 来验证它仍然返回“Hello wavepress!”来自 Node JS api 模块的消息如图 4-44 所示。如果是,这意味着 UAA 服务实例正在应用中使用,并且被应用使用。如果用户尚未在系统中通过身份验证,可能会出现凭据提示。如果出现这种情况,请向系统提供凭据。
图 4-43
在包含路由身份验证后,将应用作为 web 应用重新运行
注意图 4-43 中 ui 模块使用的同一个端口,图 4-44 中主机或域后面附加了 api 模块路由(相对路径)。浏览器输出由 nodejs 服务生成。
图 4-44
Hello wavepress 端点在进行 api 调用后将输出返回到浏览器中
保持“Hello wavepress!”端点暂时作为健康检查端点(如图 4-45 第 13 行所示)。健康检查端点在验证服务已启动并正在运行时非常有用,无需发出需要一直返回到数据库的请求。有时,该运行状况检查端点也称为心跳。
在 XSA 环境中,这是学习请求的一个巨大进步。如果需要,请多次回顾这些步骤,以理解集成点。
在能够创建和验证第一个健康检查端点之后,继续 api 开发的其余部分。通常,API 以 GET 端点开始。GET 端点允许 API 向请求显示一些数据。
继续创建一个端点,该端点将对数据库执行 select 语句(利用 HTTP GET 请求),如图 4-45 所示。这个操作代表了从 api 模块到数据库工件的第一次集成。使用在第 2 章第 2.4 节(CV_DEVICES)中创建的计算视图,请求将如图 4-45 所示。
图 4-45
wavepress.js 服务显示视图中的选择
每次编辑或添加代码时,都必须重新构建并重新运行 api 模块。请求从 api 模块获取/devices 端点。如果视图存在,并且后端表中有数据,请求将根据提供的 select 语句返回一些数据。为简单起见,api 请求的第一条和最后一条记录如图 4-46 所示。
图 4-46
从浏览器调用 api 后的计算视图输出
要显示 REST API 中相同端点的不同方法,通过 POSTMAN REST 客户端工具发送请求。如果一切正常,它应该显示相同的输出。
一旦该工具成功验证了请求,就进入下一个场景。将显示一个 POST 请求,演示在数据库表中插入和更新记录。
在 POSTMAN 请求中使用来自浏览器的相同 URL,API 将返回一个 未授权的 HTTP 错误响应,因为请求是从 ui 模块的浏览器会话发起的。出现凭证提示, ui 模块将请求转发给 api 模块。邮递员将需要一个稍微不同的方法。
图 4-51
邮递员获取新的访问令牌表单
-
Ensure POSTMAN has the request URL that will be made. Ensure that the setting for collecting cookies is enabled (displayed as a satellite icon on the top right of the tool) as shown in Figure 4-48.
图 4-48
邮递员
-
打开 授权 页签,选择 OAuth 2.0 作为所需类型。
-
Click the Get New Access Token button on the right side of the screen shown in Figure 4-49.
图 4-49
邮递员授权获取新的访问令牌
The form for OAuth will appear. It requires it to be populated with certain values from the environment variables displayed from the XSA cockpit. The correct environment variables can be collected from the XSA cockpit by navigating to the api application and selecting the environment variables. Look at the values provided within the xsuaa section shown in Figure 4-50.
图 4-50
用户提供服务的 XSA 驾驶舱内的环境变量
Pay close attention to the VCAP_SERVICES setting, examine the xsuaa section, and obtain the following values to provide to the form from Figure 4-51:
-
令牌名称 可选。可以提供任何名称。
-
接入令牌 URL 是 XS 控制器 UAA 服务 URL。
-
在 URL 末尾追加 /oauth/token 。
-
客户端 ID 的值显示了环境变量里面的值。这是一个编码字符串。
-
客户端的也在同一个区段内的环境变量值内。它也是一个编码字符串。
*** 点击请求令牌生成将在 POSTMAN 中使用的令牌。
** -
**1. 为了模拟授权,需要一个 OAuth 令牌:
打开 POSTMAN 并将 URL 设置为后端 api(不是从浏览器,而是从 SAP Web IDE 控制台)。
The URL appears after building and running the api module as shown in Figure [4-47](#Fig47).

图 4-47
运行 Node 模块后 SAP Web IDE 的控制台输出
要使用 POSTMAN 生成令牌,请遵循以下步骤:
一旦请求,令牌就会出现在 POSTMAN 的主请求/响应窗口中,如图 4-52 所示。
图 4-52
邮递员获取新的访问令牌并输出新的令牌
- 发送请求并观察收到的响应类型。
配置授权令牌后,尝试如图 4-53 所示的 POST 请求。
要执行 POST 请求,需要其他属性:
-
需要指定要调用的下一个端点,因为不同的端点将在 api 中执行不同的操作。此端点不同于原始的 GET 操作。这一次,它将用于插入、更新或删除数据库中的记录。
-
选择 POST 作为 HTTP 方法。
-
提供请求的正文。POST 主体需要 JSON 有效负载(而不是执行 GET 请求,在 GET 请求中,输入参数作为查询字符串值在 URL 中发送)。
-
对 POST 请求的响应也将作为 JSON 有效负载返回。REST API 的消费者需要知道如何读取有效负载,以便处理额外的逻辑。
在 Node 模块和 wavepress.js 服务中,创建一个将用于 POST 请求的新端点/设备。
图 4-53
wavepress API 端点
使用从 GET 请求中检索到的示例主体有效负载将 POST 请求发送到该端点。确保提供了正确的结构,并提供 OAuth 令牌,如图 4-54 所示。
图 4-54
邮递员发布更新设备记录的请求
通过分析请求/响应过程和任何错误,可以了解从任何外部工具到 api 以及从 api 返回到外部工具(本例中为 POSTMAN)的流程,这是一个完整的往返请求。api 可能会遇到主体未定义的情况,即使请求中提供了主体。当其他问题出现时,包含额外的逻辑来解决它们是正常的。POST 请求的主体基于用户输入。它的所有属性和值都不受系统信任,必须进行验证。如果遇到这种问题,包含一个名为 body-parser 的 Node JS 模块,以便 Express 能够解释进入 API 的请求体。知道解决方案中需要这个模块,建议将其作为依赖项包含在 package.json 文件中,如图 4-55 所示。作为一个依赖项,它将被下载,并且在代码中也必须是必需的。打开 node_modules 文件夹,查看它是否已经作为不同模块的依赖项存在。无论如何,建议将它包含在 package.json 文件中,以防原始模块将来删除它的依赖项。
图 4-55
Node.js 模块中的 package.json,包括主体解析模块
包含后,在 wavepress 服务实现上导入,如图 4-56 所示。
图 4-56
wavepress 服务导入服务实现(第 4 行和第 15 行)
重新构建 api 模块后,再次运行它。开始运行后,返回到 POSTMAN,发送一个后续 POST 请求,如图 4-57 所示。
图 4-57
包含主体解析器后的邮递员更新请求
这一次,请求是成功的,因为 Express 可以读取所提供的请求正文。它也作为对 POSTMAN 工具的响应被返回。api 模块上的往返行程已经过验证。
在成功地向 POST 端点发送请求并验证其工作正常后,连接调用以执行在第 2 章第 2.4 节中编写的存储过程。建议将对 api 的调用和从 Node JS 到数据库的实现分解成小部分,确保集成场景的每一部分都在完整的场景集成之前工作。将相同的原理从 POST 应用到 DELETE HTTP 方法实现。遵循这种方法将确保默认设置没有问题。出现的任何问题都可以通过分解集成点来轻松解决。分而治之!
将加载存储过程以更新/插入记录的 JavaScript 代码如图 4-58 所示。
第 53 行获取 db 客户机对象,当使用 hdbext (sap)模块加载存储过程时,需要提供这个客户机。存储过程作为对象加载到第 56 行的 Node.js 运行时中,然后在第 63 行执行。在第 63 行执行存储过程之前,添加任何业务逻辑来验证输入或格式化输入参数。存储过程的第一个参数是提供它期望的任何输入参数。在下面的示例中,设备数组被传入。注意,设备数组包含一个对象,它是请求的主体对象。
任何输出参数都将从作为存储过程的第二个参数提供的回调中返回。在以下示例中,存储过程返回一个名为 OUT_ID 的输出参数。
很高兴看到整个请求处理、业务逻辑,以及将 SAP HANA 数据库对象作为 JavaScript 对象调用,而无需在 Node.js 实现中进行 JSON 解析,如图 4-58 所示。
图 4-58
调用 SAP HANA 存储过程的设备端点
重复重建和重新运行 api 模块的步骤,使最新的代码可用于 api。
在 api 模块运行之后,运行 POST 请求。首先从现有记录中获取原始 JSON(从 GET 请求的输出中获取),如图 4-59 所示。
图 4-59
POSTMAN GET 请求获取设备列表
将 JSON 有效负载作为下一个 POST 请求的主体复制到不同的 POSTMAN 选项卡上。更新主体中的一个属性,即 TEMP_F 值从 74 到 72,以测试更新操作,如图 4-60 所示。点击发送。
图 4-60
更新记录后来自 wavepress 服务的邮递员 POST 请求和响应
如果主体结构正确并且存储过程成功执行,存储过程的响应将返回更新后的 ID 值作为响应的输出。可以通过重新运行 GET 端点并查看实时更新的值来验证响应,如图 4-61 所示。
图 4-61
邮递员请求验证更新的记录
运行插入操作,模拟新记录进入数据库。请注意,ID 属性为 null,并确保 TEMP_F 的数据类型为 decimal,而不是 string,以避免在 SQL 语句执行期间出现数据类型异常,如图 4-62 所示。
图 4-62
邮递员请求发送空 ID 以插入记录
在 nodejs api 中添加逻辑来处理错误的输入和输出响应是一个很好的做法,可以让 api 的使用者有任何不正确的行为或期望值。
像之前一样,通过 GET HTTP 请求端点重新运行验证,如图 4-63 所示。
图 4-63
邮递员请求通过 GET 请求验证最后一次插入
接下来测试删除端点,如图 4-64 所示。请记住,在这个端点中,必须提供希望删除的记录的 ID。记录的 ID 作为 URL 的参数传递,而不是在请求体中传递。删除端点的路径如图 4-64 所示。
图 4-64
wavepress 服务显示删除操作的端点
这一次,查询字符串参数包含将被删除的记录的 ID。该 ID 作为存储过程的输入参数 IN_DEVICE_ID 传递。
从 POSTMAN,删除请求出现,如图 4-65 所示。
图 4-65
邮递员请求发送删除请求
要验证请求,请重新运行 GET 语句,确保响应中不再存在匹配设备 ID = 13 的记录。请注意图 4-66 中 SQL 控制台显示的项目顺序的差异。
图 4-66
验证记录不存在的数据库资源管理器 SQL 控制台
如图 4-67 所示,可以再次使用 GET 请求从 POSTMAN 验证删除操作。
图 4-67
验证已删除记录的邮递员请求没有从 GET 请求中返回
调试是在代码中设置断点(中断执行)的过程,目的是排除错误或检查代码中特定点的值。调试是任何软件开发的基础部分,应该小心谨慎地进行。
要在 SAP Web IDE 中运行调试场景,请在 api 模块中选择一个端点,设置几个断点,并启动一个调试会话,如图 4-68 所示。当前小节显示了如何设置调试会话。
图 4-68
Web IDE 调试窗格
在 api 模块中,打开 wavepress 服务并执行以下操作:
-
在代码行上(屏幕截图的左侧),单击其中一行以设置断点。
-
在右侧导航面板中,选择顶部第五个图标以打开调试窗格。请注意,在调试窗格的底部,它显示了设置调试点的两行。
-
在调试窗格的顶部附近,可以看到活动会话标签,下拉控件显示选定的活动会话。在下拉控件旁边,有建立会话、分离会话和显示会话信息的图标。
图 4-69
Web IDE 调试点
- 点击附加调试器图标(图 4-69 )。
图 4-70
Web IDE 将调试附加到目标
- 选择 api 会话(通过选择运行脚本开始)并点击确定按钮(图 4-70 )。
请注意,断点有一个复选标记,调试器窗格显示一个活动会话。如果调试器处于活动状态,继续运行来自 POSTMAN 的请求,如图 4-71 所示。
图 4-71
Web IDE 调试器正在运行
触发 POSTMAN 的请求执行 api 中的代码,并在设置的第一个断点处停止,如图 4-72 所示。
图 4-72
活动会话期间的 Web IDE 和调试窗格
由于调试器已经在预期的位置停止,请检查右侧的调用堆栈。调用堆栈显示在断点处停止执行的语句。
调试器中的导航可以通过顶部图标(在调试器部分下)或使用键盘中的一些功能键来执行。它非常简单,使用的方法和在其他开发工具中一样。
播放按钮将从当前行开始推进代码执行,只有在当前执行行前面有另一个断点时才会再次停止。如果没有设置其他断点,那么执行将继续,直到执行结束。此功能也可以通过按键盘上的 F8 来执行。
下一个图标(指向右边的箭头)是跨过。单步执行功能允许开发人员继续执行,并允许执行跳过嵌套函数内的代码。通过按键盘上的 F10 可以实现跨越。
接下来,是进入特性的步骤。这个特性允许执行到下一行,它也进入嵌套函数。如果您想要逐行检查方法,请使用此功能。按键盘上的 F11 键也可以达到同样的效果。
最后,在调试子部分中,有步出(当前函数的)。当函数嵌套在内部时,使用此功能可以跳出函数。通过按键盘上的 Shift+F11 可以实现相同的功能。
变量选项卡(图 4-73 )用于局部变量值、全局变量值和当前代码执行的任何其他类型的范围变量,包括 JS 闭包。
图 4-73
调试变量
除了检查当前变量值外,还可以设置 表达式 (图 4-74 ) 。 点击 表达式 选项卡,点击表达式下的加号,添加一个表达式。
图 4-74
调试观察表达式
如果设置正确,表达式选项卡将显示添加的表达式。任何作为对象的表达式将允许进一步扩展以查看其嵌套属性,如图 4-75 所示。
图 4-75
调试表达式
在表达式部分下,可以选择 控制台 部分(图 4-76 )。此部分允许输入变量名以快速表达式求值的方式查看值,而表达式选项卡将继续显示当前值,即使在推进代码执行后也是如此。
图 4-76
显示变量值的调试控制台
另一个必须描述的场景是从 SAP Web IDE 中调试存储过程。存储过程是充当函数的数据库工件,它们对数据库表执行读取、创建、更新和删除操作。存储过程接受简单类型(NVARCHAR、INT、DECIMAL、SECCONDDATE)或复杂类型(作为表的结构)的输入和输出参数。在第章第 2 节第 2.4 节中,创建了 SP_DEVICE_UPSERT 存储过程,用于描述在第章第 4 节第 4.3 节中创建的/device 端点的场景。开发 API 时,有时上下文中的问题可能在 JavaScript 代码之外;但是,如果开发人员能够对 SAP HANA 数据库中的 SqlScript 进行故障排除,就会产生一个端到端的开发场景。
首先打开数据库浏览器并选择存储过程。右键选择打开调试,如图 4-77 所示。
图 4-77
存储过程调试
单击选项“打开以进行调试”后,会有一个弹出窗口显示附加调试器的不同方式。保持“SQL 控制台连接”处于选中状态,因为该示例将从数据库资源管理器中显示该存储过程的调试。在图 4-78 中选择确定。
图 4-78
通过 SQL 控制台连接将调试器附加到存储过程
存储过程将在数据库浏览器中打开,调试点的设置方式类似于在 Node JS API 中的设置方式。在显示行号的屏幕左边添加一些调试点。参见图 4-79 。
图 4-79
调试存储过程
在 SAP Web IDE 的右侧,观察调试窗格,如图 4-80 所示。
图 4-80
存储过程调试会话期间的调试器
打开 SQL 控制台窗口,准备调用存储过程。由于 SP_DEVICE_UPSERT 存储过程使用表类型作为输入参数,因此该示例显示了一个与输入参数具有相同结构的临时表。添加到临时表中的记录模拟相同的结构。调用存储过程之前的 select 语句是为了验证数据是否存在。
突出显示调用“WAVEPRESS_HDI_DB_1”。" wave press . db . procs::SP _ DEVICE _ UPSERT "(…。)语句并点击运行图标(图 4-81 左上角的绿色播放按钮)。
图 4-81
SQL 控制台开始调试以表类型作为输入参数的存储过程
如果输入参数具有正确的结构,则调试会话开始,存储过程的执行在断点处停止,如图 4-82 所示。
图 4-82
调试在存储过程中的调试点停止
在调试器中(图 4-83 ),调用栈显示当前执行的位置。此外,“上下文变量”和“表达式”选项卡显示了调试会话中用于分析的可用信息。本章展示了这些相同的选项卡和功能。
图 4-83
调试存储过程时调试调用堆栈和变量
使用调试器的逐句通过、单步执行或继续执行功能继续移动执行。一旦该对象中的调试完成,输出(如果有)将显示在启动调试会话的 SQL 控制台中。
如本章所示,调试功能通常是相互结合使用的,例如使用调试变量或编写输出到控制台的表达式,以及在从 SAP Web IDE 调试 Node JS 或 XSJS 代码时,使用特殊的键盘按键从一条代码语句移动到另一条代码语句(或从一个调试点移动到另一个调试点)。调试控件用于 SAP HANA XSA 环境中 API 软件开发的任何典型场景。请记住,调试发生在服务器端,外部工具有助于启动这些调试会话(使用 POSTMAN 的 POST 请求或 GET 请求的浏览器窗口)。使用这些功能通常可以让开发人员理解软件程序的流程和执行逻辑,并有助于理解 SAP Web IDE 和数据库浏览器的行为。无论这种情况需要调试 JavaScript 还是 SqlScript 代码,本节都展示了这两种情况、如何准备处理它们以及执行开发和调试的建议方法。
本章最后展示了任何有经验的开发人员所期望的所有技巧和提示,只要能够在开发周期中导航工具,能够设置调试点,能够调试软件系统的每个方面,无论是在存储过程的后端还是在提供健壮 api 的微服务中;本章介绍了每个集成点,并确定了成功完成端到端开发场景的各种方法,包括 GET、POST 和 DELETE HTTP 方法。**

















































































