JavaScript 消费 ABAP Remote Enabled Function Module

文摘   2024-12-07 22:20   四川  

笔者前一篇文章,介绍了下图所示的技术解决方案,适用于那些虽然后台 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=MMEUSER=用户名PASSWD=密码ASHOST= ABAP 系统的消息服务器地址SYSNR=78CLIENT=504LANG=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 的相关开发细节。

汪子熙
企业管理软件领域开发专家
 最新文章