云端的 ABAP Restful 服务开发以及通过 abapGit 传输到其他系统的详细步骤

在本地部署环境即 On-Premises 环境下,如果想将 ABAP Netweaver 里的资源以 Restful API 的方式暴露出来,SICF 这个事务码绝对是一大利器。

我们只需要在 SICF 里合适的路径下创建节点,为该节点创建一个 ABAP 类,就可以专注于实现接口定义的方法 IF_HTTP_EXTENSION~HANDLE_REQUEST, 在里面编写应用逻辑了。应用开发人员无需关注和操心这些 ABAP 类什么时候被实例化和调用,可以把这个 HANDLE_REQUEST 方法看作是一个回调函数,当请求到来时,由 Netweaver 的 ICF 框架(Internet Communication Framework)负责把请求路由到对应的 ICF 节点并创建 ABAP 类,调用 HANDLE_REQUEST 方法。

每个 SICF 节点会根据其路径被分配一个 url, 如果是 Corporate 网络里,用浏览器或者编程语言直接访问该 url,就能消费 SICF 暴露的资源了。

如果想让这个位于 Corporate 网络内的 url 被 Internet 网络访问,就得借助 SAP Cloud Connector,实现内外网穿透,将内网的资源通过 Cloud Connector 暴露给外网消费。

对于 ABAP 开发人员来说,一个好消息是,SAP Cloud Platform 如今也支持 ABAP 运行环境了。本文我们通过在 SAP 云平台 ABAP 运行环境里完成类似之前在 On-Premises ABAP 系统的 SICF 事务码里的开发任务,来感受 ABAP 到了云端之后,给 ABAP 开发者带来的巨大便利。

通过 ABAP Development Tools 连接 SAP 云平台 ABAP 运行环境的一个实例,完成登录后,后续的操作步骤,同使用 ABAP Development Tools 连接一个 On-Premises ABAP 系统,几乎没有差别。

下图是在云上的 ABAP 环境里,允许我们创建的 ABAP 对象列表,既有 ABAP 开发人员感到亲切的 ABAP 字段对象,ABAP 开发包,ABAP 消息类等等,也有上了云端之后的新面孔,比如 Cloud Communication Management 和 Cloud IAM 等。

为了完成在 On-Premises 的 SICF 事务码里的开发工作,现在我们要在云上的 ABAP 环境里创建一个新的 HTTP Service:

新建一个名为 ZHELLOWORLD 的 service,创建完毕之后界面如下:

ABAP 老司机们看到这界面,立即知道下一步怎么做了吧。点击 Handler class,就可以进入 ABAP 类的编辑界面,实现这个 HTTP 服务的业务逻辑。而通过 url 字段里维护的值,我们可以在 PC 或移动设备里,浏览器或代码里访问这个服务。

该服务实现类和 On-Premises 的区别,不过是接口名称从 IF_HTTP_EXTENSION 换成了 IF_HTTP_SERVICE_EXTENSION.

当然,前者因为是直接在云端编写的 ABAP 代码,所以还要遵循 Jerry 之前的文章 在 SAP 云平台 ABAP 编程环境上编写第一段 ABAP 程序 里提到的那些限制。

上述的 ABAP 代码只是简单地返回给消费者一个 Hello World 的文本信息,保存激活之后,把 url 贴到浏览器里,就能看到期望的 Hello World:

我们从 url 里,容易得出这样的结论,SAP Cloud Platform ABAP 运行环境里支持创建的 HTTP 服务,其实现原理,其实就是在 Netweaver 服务器的 SICF 路径/sap/bc/http/sap/下面增加一个新的节点罢了,只是这个操作,在云端不再需要由 ABAP 开发人员手动完成,云端的 ABAP 环境,会自动创建这一底层设施。

在云端的 ABAP 环境里完成了 Restful 服务的开发之后,如何将这个服务传输到其他系统呢?

SAP ABAP 顾问朋友们,应该都使用过 SAPLink 这个工具。如果两个 ABAP Netweaver 系统没有建立起传输路径时,我们无法使用标准的 SE10 事务码创建传输请求的方式进行这两个系统间的代码传输。此时,SAPLink 就有了用武之地。

SAPLink 简单地说就是一个报表和一系列插件的集合。如果我们期望在系统 A 和 B 之间传输代码,步骤为:

(1) 在系统 A 和 B 上都安装 SAPLink,其实也就是手动创建报表,然后从 SAPLink 的 github 上把源代码拷贝过来,激活即可:https://github.com/sapmentors/SAPlink(2) 在系统 A 上执行 SAPLink,把想传输的代码导出成一个本地文件。(3) 在系统 B 上执行 SAPLink,将前一步生成的本地文件导入。

SAPLink 的介绍文章,网络上太多了,本文不再赘述。

到了云时代之后,SAP 云平台 ABAP 编程环境的代码版本管理,选择了基于 abapGit 这个开源项目的 GIT 来进行。

下面跟着 Jerry 一起,通过一个简单的例子来了解怎么做吧。

Jerry 这个例子的场景是,我在 ABAP On-Premises 系统 AG3 里,开发了一些 ABAP 代码。我想通过 abapGit,把这些 On-Premises 系统上的 ABAP 代码导入到 SAP Cloud Platform ABAP 环境里。

(1) 首先到这个 Github 仓库里找到 abapGit 的源代码,拷贝到 On-Premises 系统里。

激活之后运行报表,界面如下:

(2) On-Premises 系统上的 ABAP 代码是无法直接推送到 SAP 云平台 ABAP 环境的,需要一个中转站,即 github.com 上的代码仓库。为此,Jerry 新建一个代码仓库:test-sap-abap-cloud.

(3) 回到 On-Premises 系统的 abapGit 报表,点击工具栏的 Online 超链接,同第二步创建的 Github 仓库建立关联。

上图的意思是我在 On-Premises 系统里新创建的开发包,$ZJERRYPACKAGE 里面的代码,会和 github.com 的 test-sap-abap-cloud 这个仓库建立关联。

因为我的开发包里尚未创建任何代码,所以此时 abapGit 里除了包描述 XML 文件外,没有显示任何和 ABAP 代码相关的资源文件。

(4) 现在我在 On-Premises 系统里随便创建一个 Hello World 的报表:

回到 On-Premises 系统的 abapGit,刷新,此时就能看见我刚刚创建的 ABAP 报表了。

和大家使用 Mac 或者 Windows 版本的 Git 客户端一样,我首先用 abapGit 把 On-Premises 系统创建的这个 Hello World 报表推送到 github.com:

随便维护一个推送注释,比如 the first commit from Jerry's abapgit:

成功推送完毕,现在 github 上的仓库已经能看到刚刚推送的来自 On-Premises 系统的报表代码和推送注释了:the first commit from Jerry's abapgit

(5) 现在我们可以把 github.com 仓库里的代码导入到 SAP 云平台 ABAP 环境了。给 ABAP Development Tools 安装 abapGit 插件,地址为:eclipse.abapgit.org/updatesite

安装完毕后,打开 abapGit 视图:

登录 SAP Cloud Platform ABAP 编程环境,点击 Link 按钮:

输入 github.com 的仓库地址:

指定 SAP 云平台 ABAP 环境里 ZJERRY 这个包存放来自 github.com 的 ABAP 代码:

clipboard18,18 当我们在 abapGit 视图里看到标记为 Imported 状态的条目时,说明导入成功。然而,在 SAP 云平台 ABAP 环境的开发包 ZJERRY 里,我并没有看到 On-Premises 系统里的 Hello World 报表,这是怎么回事呢?

原来,在 SAP Cloud Platform ABAP 环境里,能允许开发人员编写 ABAP 代码的载体就只有下列五种,不支持 On-Premises 环境里通过 SE38 创建的 ABAP 报表。如果我们在 On-Premises 系统里创建一个 ABAP 类,通过本文介绍的步骤,是能够顺利导入 SAP 云平台 ABAP 环境并可以继续在其上开发的。

在 SAP 云平台 ABAP 编程环境里,我们如果想模拟 On-Premises 环境 SE38 里创建的报表,可以通过创建实现了接口 IF_OO_ADT_CLASSRUN 的 ABAP 类来完成。右键单击这种类,选择 Run As ABAP Application(Console)即可。

希望本文能加深大家对下图中通过 GIT 来进行 SAP Cloud Platform ABAP 环境中代码管理这一概念的理解,感谢阅读。

总结

本文首先介绍了在 SAP 云平台 ABAP 编程环境如何完成类似过去 On-Premises 平台上开发 SICF 服务的步骤来开发基于云的 Restful API,接着详细阐述了如何使用 abapGit 这一工具,将 ABAP 编程环境开发好的 Restful 服务传输到另一个云系统。

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/e9cbb93d8e369825991075e59
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券