笔者前一篇文章,介绍了下图所示的技术解决方案,适用于那些虽然后台 ABAP 系统版本低于 NetWeaver 7.0, 无法使用 OData,但仍计划使用 Angular,React 和 Vue 等主流前端开发框架,消费 ABAP 后台 BAPI 的客户们。
如果不用 OData,Web 应用如何消费 ABAP 系统的 BAPI 等业务逻辑?
SAP 官方对主流的编程语言和工具,比如 C#,Java,Python 和 Node.js,都提供了完备的 SDK,开箱即用。
应用开发人员运用这些 SDK,能很容易地选择自己熟悉的技术栈,通过 RFC 调用的方式,消费 ABAP 后台的 API.
本文介绍如何使用 JavaScript 这门编程语言,连接 ABAP 系统。
JavaScript 包含浏览器端和服务器端执行两种场景。浏览器端运行的 JavaScript,可以使用 HTTP 协议,消费 ABAP 系统通过 ICM(Internet Communication Manager) 暴露出来的后台服务。
笔者之前工作中的很多原型开发,均采取了这种方案。因为不需要额外的 OData 建模和实现,开发速度非常快。
一些具体的例子:
运行在服务器端的 JavaScript,即 Node.js.
SAP 提供了连接 SAP ABAP 系统的 Node.js SDK,名叫 node-rfc.
https://github.com/SAP/node-rfc
使用这个库之前,需要按照上述文档介绍的步骤,先下载 SAP NW RFC SDK zip 包,解压后,将 lib 文件夹的路径,配置到操作系统的 PATH 环境变量中。
下面通过一个实际的例子来介绍这个 SDK 的用法。测试用的 Function Module 是 SAP 标准发布的 STFC_STRUCTURE.
这个 Function Module 专门用来演示,在 RFC 过程中如何传递 ABAP Structure和 Table 这种结构的参数。
其参数定义如下,接受一个输入参数 IMPORTSTRUCT 和 TABLE 参数 RFCTABLE.
其内部逻辑只是把调用方通过这两个参数传递进来的数据,再直接返回给调用方。
Node.js 完整代码如下:
const noderfc = require("node-rfc");
const client = new noderfc.Client({ dest: "MME" });
(async () => {
try {
await client.open();
const abap_structure = {
RFCINT4: 345,
RFCFLOAT: 1.23456789,
RFCCHAR4: "ABCD",
RFCDATE: "20180625",
};
let abap_table = [abap_structure];
const result = await client.call("STFC_STRUCTURE", {
IMPORTSTRUCT: abap_structure,
RFCTABLE: abap_table,
});
console.log(result);
} catch (err) {
console.error(err);
}
})();
代码第一行,通过 require 导入 node-rfc, 因此需要在 package.json 的 dependencies 区域导入依赖,然后使用 npm install 安装依赖。
代码第二行,通过 Destination 拿到连接 ABAP 系统 MME 的客户端实例。在 ABAP On-Premise 和 SAP BTP 上都有这个 Destination 的概念。
ABAP On-Premise 系统通过事务码 SM59 创建指向远端 ABAP 或者第三方系统的 Destination.
在基于 node-rfc 的应用里,通过文件来定义 Destination.
在项目文件夹里新建一个 sapnwrfc.ini 文件,维护如下内容,就定义了一个指向 ABAP 系统 MME 的 Destination.
DEST=MME
USER=用户名
PASSWD=密码
ASHOST= ABAP 系统的消息服务器地址
SYSNR=78
CLIENT=504
LANG=EN
这个 ini 文件里的值,都可以从 SAPGUI 登录系统的选项里获得。
代码中的两个 JavaScript 变量,abap_structure 和 abap_table, 分别用来维护准备传递到 ABAP Function Module Importing 和 Table 参数的内容。最后调用 client 实例方法 call,就能通过 RFC 方式,向名为 MME 的 Destination 指向的 ABAP 系统,发起 RFC 调用了。
将上面的代码保存成一个 .js 文件,用命令行 node 执行,看到下列从 ABAP 后台系统返回的输出:
执行之后,在当前项目文件夹内,自动生成了一个 log 文件:dev_rfc.log,其中提到了一个名叫 CPIC library 的库及其版本。
ABAP 应用开发人员不会直接和这个库打交道。CPIC 是 Common Programming Interface for Communication 的缩写。ABAP RFC 基于 CPIC,但提供了更高级别的抽象,使得 ABAP 开发人员可以更方便地实现远程调用。
换言之,CPIC 是底层的通信接口,而 RFC 则是在 CPIC 之上构建的更高级的通信机制。
笔者后续的文章,会介绍更多使用这些 SDK 去调用 ABAP RFC 的相关开发细节。