在现代企业软件解决方案中,OData 作为一种标准化的 RESTful API 接口,在 SAP 的产品生态系统中有着广泛的应用。
OData(Open Data Protocol)是一种由 Microsoft 提出的基于 REST 架构风格的协议,用于创建和消费数据 API。它的核心功能是将服务端的数据通过一个标准化的接口,以 RESTful 的方式暴露出去,从而使不同的客户端应用程序能够轻松获取这些数据。
对于 SAP 这样的企业级软件系统,OData 允许系统在不同的应用程序之间实现无缝的数据通信和集成。
无论是 SAP S/4HANA、SAP Business Suite,还是 SAP Cloud for Customer,OData 都在这些基于 ABAP 技术栈的产品中扮演了重要的角色,成为连接前台 Fiori 页面和后台业务逻辑之间的桥梁。
关于 OData 在 SAP 产品中使用场合和技术实现的更多细节,请参阅笔者之前的文章和开发教程:
要使用 OData 协议,ABAP 系统所需满足的最低版本是多少?
根据下面这篇 SAP 博客的介绍,使用 SAP Gateway AddOns,基于 OData V2.0 的服务实现,可以在 ABAP NetWeaver 7.40 SP18 及之后的版本完成:
https://community.sap.com/t5/technology-blogs-by-sap/odata-service-development-options/ba-p/13359604
SAP Press 这篇博客提到,NetWeaver 7.50 SP04 是第一个同时支持 OData 2.0 和 4.0 的 ABAP 版本。
https://blog.sap-press.com/whats-different-with-odata-4-for-sap
那么对于那些仍然使用较低版本的 ABAP 系统的客户而言,没有 OData 的支持,但如果仍然想使用 React,Vue 和 Angular 等前端框架开发 SAP Web 应用,应该采取什么方式,去消费 ABAP 后台系统的 BAPI 等业务逻辑呢?
下面这篇 SAP 社区博客给出了一种方案,如下图所示。
https://community.sap.com/t5/technology-blogs-by-sap/powerful-web-applications-with-old-and-new-abap-systems/ba-p/13578504
无独有偶,笔者早些年去国内几个 SAP CRM 客户拜访时,和客户方的 IT 架构师聊过,发现他们当时也正在使用这个方案。
下图绿色所示的模块代表中间件,是一个轻量级的 Web 服务器,可以采用客户开发部门最为熟悉的技术栈和编程语言,比如 Java,Python,C#,Node.js 来完成。
中间件 Web 服务器要完成两个任务:
1. 通过 SAP 官方提供的 SDK(本文后续详细介绍),通过 Web Service / RFC 的方式,连接并消费 SAP ABAP 系统的 Remote Enabled Function Module.
2. 将 ABAP Function Module 返回的业务数据,转换成 JSON 格式。下图左侧黄色区域的 Web 应用,通过普通的 HTTP 协议消费这些 JSON 数据,完成控件的数据绑定和展现。
中间件服务器只是扮演一个简单的请求转发和数据格式转换的代理,因此可以实现得非常轻量。
下图展示了基于 Python 实现的中间件 Web 服务器。使用注解 @app.route 向 Web 应用暴露了 HTTP POST 接口,通过解析 Web 应用 HTTP 请求 url 里携带的参数,将请求转发给 ABAP 后台服务器对应的 Function Module /COE/RBP_PAMXXX, 对系统中的 Equipment 业务数据进行对应的操作。
这里的 abap_client 就是调用 SAP 官方发布的 Python SDK 之后获得的对象实例。调用实例的 call 方法就能对 ABAP 系统发起 RFC 调用了。
React,Angular 和 Vue 这些流行的前端框架,提供了完备的 HTTP 库,开发人员可以轻松完成 HTTP 请求调用和视图的数据绑定。
下面是 SAP 官方发布的基于各种编程语言来消费 ABAP RFC 函数的 SDK 概述。
SAP Connector for Microsoft .NET
SAP Connector for Microsoft .NET(简称 NCo)旨在使 .NET 应用程序能够与 SAP 系统进行通信。
通过 NCo,开发人员可以在 .NET 环境中调用 SAP 的 BAPI和 Remote Enabled Function Module,实现数据交换和功能集成。
此外,NCo 还支持从 SAP 系统调用 .NET 组件,提供双向通信的能力。
官方文档链接:
https://support.sap.com/en/product/connectors/msnet.html
PyRFC
PyRFC 是一个 Python 库,使开发者能够通过 Python 调用 ABAP 模块,或从 ABAP 调用 Python 模块。它封装了现有的 SAP NetWeaver RFC 库,利用 Cython 重写,旨在为 Python 与 SAP 系统之间的通信提供简洁而高效的接口。
PyRFC 支持的功能有:
客户端和服务器绑定,支持从 Python 调用 ABAP 模块,以及从 ABAP 调用 Python 模块。
在 Python 和 ABAP 数据类型之间自动转换,简化了数据处理。
支持无状态和有状态连接,允许在同一 ABAP 会话中进行多次函数调用。
支持顺序和并行调用,可使用一个或多个客户端进行操作。
提供吞吐量监控,帮助开发者优化性能。
Github 地址:https://github.com/SAP/PyRFC
node-rfc
node-rfc 是一个用于在 Node.js 环境中与 SAP 系统进行通信的客户端库。
它提供了异步、非阻塞的 SAP NetWeaver RFC SDK 绑定,使得开发者可以在 Node.js 应用程序中调用 SAP 系统中的 Remote Enabled Function Module.
Github 地址:
https://github.com/SAP/node-rfc
SAP Java Connector
简称 JCO,核心功能包括:
远程调用 SAP 函数:Java 应用程序可以通过 JCO 调用 SAP 的 RFC Function Module,并接收 SAP 系统的返回数据。
数据交换:JCO 可以实现 Java 与 SAP 系统之间的数据交换。无论是从 SAP 系统提取数据到 Java 应用程序,还是通过 Java 应用程序向 SAP 系统发送数据,JCO 都能够高效处理。
双向通信:SAP JCO 不仅允许 Java 应用程序调用 SAP 系统中的功能,还可以实现 SAP 系统调用 Java 应用程序的功能模块。
官方文档地址:https://support.sap.com/en/product/connectors/jco.html
后续笔者会选择以上介绍的部分 SDK,详细介绍其技术实现原理。