这是 Jerry 2021 年的第 47 篇文章,也是汪子熙公众号总共第 324 篇原创文章。

Jerry 2014 年时,曾经在 SAP 社区上写过一篇英文博客,介绍了如何在 ABAP On-Premises 系统里,创建和消费 Web Service:

Step by step to create, consume and trace web service in ABAP system

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

这篇文章的中文版,请移步这个链接:

最详细的 SAP ABAP Web Service 创建和消费步骤讲解

到了 SAP BTP 上的 ABAP 编程环境里,我们仍然可以沿用 On-Premises 系统里的 Destination 概念,在云上的 ABAP 代码里,消费第三方的服务。区别在于 On-Premises 系统里的 Destination 通过事物码 SM59 创建,而云上的 ABAP,则在 SAP BTP 控制台里创建 Destination 实例。具体步骤请参考 Jerry 之前的文章:SAP云平台上的ABAP编程环境里如何消费第三方服务

本文介绍如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service. 如果阅读过 Jerry 前面提到的两篇文章,理解本文的内容不过是几分钟的事情。

登录 SAP BTP 平台的 ABAP 编程环境。具体步骤,可以参考 Jerry 之前翻译的 OpenSAP Fiori Elements 公开课,第一周第四单元的视频,里面包含了详细步骤。

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

新建一个 Service Consumption Model.
如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

Remote Consumption Mode 可以选择 OData,RFC 或者 Web Service. Jerry 之前介绍 Fiori Elements 和 Restful ABAP Programming 模型时,曾经使用过 OData 模式。本文我们使用 Web Service 模式。

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

下一步我们需要为这个 Consumption Model 上传一个 WSDL 文件。Jerry 的文章 深入理解 SAP Fiori Elements 工作原理系列之二:如何给 SAP Fiori Elements 应用添加自定义按钮 曾经提到过 SAP ES5 系统,这是一个 Demo 系统,SAP 在上面发布了很多用于教学目的的 OData 服务和 Web Service.

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

本文我们使用一个简单的 Product Web Service,能根据产品 ID 查询到其价格。该 Web Service 的 WSDL 文件,可以在这个链接获得。

上传 WSDL 文件之后,给该 Consumption Model 维护一个前缀 ZJERRY,这样接下来激活模型,生成的一系列开发资源,其名称均带有 ZJERRY 前缀,便于查询。

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service
激活 Consumption Model 后,在项目资源列表里,观察到一系列自动生成的 ABAP 资源,包含运行时所需的数据类型定义,以及用于消费该 Web Service 的 ABAP Proxy 代理类。

同时,ADT 为我们自动生成了一段模板代码,演示了如何消费自动生成的 ABAP 代理类来调用 Web Service. 点击 Copy to Clipboard,把这段代码粘贴到剪切板中,后续可以直接用。

下面我们创建一个 ABAP 类,把前一个步骤拷贝到剪切板里的 ABAP 代码,粘贴到这个新创建的 ABAP 类里。

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

调用 Web Service 的核心代码如下图所示,待查询价格的产品 ID,硬编码成 JERRYPRODUCT.

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

其中第22行的 cl_soap_destination_provider=>create_by_url,输入参数 i_url 的值,来自 WSDL 文件里 soap:address 节点的 location 属性值。

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

直接运行这个 ABAP 类,在 console 上看到错误输出。这个错误消息来自 ABAP Proxy 类的 get_price 方法时抛出的异常:zjerrycx_fault_msg_type:

Product not found. Try e.g. HT-1000

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

错误消息表明,这是一个应用程序层级的错误,因为我硬编码的产品 JERRYPRODUCT,在 ES5 系统后台不存在。

使用 ES5 系统上 SAP 发布的一个标准 OData 服务,查询该系统后台到底有哪些创建好的 Product 主数据,随便选择一条产品数据,ID 为 AR-FB-1000,其价格为 3.25:

https://sapes5.sapdevcenter.com/sap/opu/odata/sap/EPM_REF_APPS_PROD_MAN_SRV/Products

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

再次调用该 Web Service,这次在控制台里看到了期望的输出:

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

由此可见,SAP BTP 云平台 ABAP 编程环境上消费 SOAP Web Service,步骤比 ABAP On-Premises 系统上还要简捷一些。

如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

Jerry 的 ABAP 专题

更多Jerry的原创文章,尽在:"汪子熙":
如何在 SAP BTP 平台 ABAP 编程环境里消费基于 SOAP 的 Web Service

相关文章:

  • 2021-06-27
  • 2021-06-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-05-04
  • 2022-12-23
  • 2022-01-22
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-04-14
  • 2021-10-06
相关资源
相似解决方案