这是 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_编程环境_02

新建一个 Service Consumption Model.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

错误消息表明,这是一个应用程序层级的错误,因为我硬编码的产品 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_java_12

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

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

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

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

Jerry 的 ABAP 专题

  • Jerry的ABAP, Java和JavaScript乱炖
  • ABAP开发人员未来应该学些什么
  • Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现
  • Jerry的ABAP原创技术文章合集
  • 300行ABAP代码实现一个最简单的区块链原型
  • 使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数
  • 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务
  • ABAP vs Java, 蛙泳 vs 自由泳
  • 聊聊C语言和ABAP
  • 动手使用ABAP Channel开发一些小工具,提升日常工作效率
  • 我用ABAP做过的那些无聊的事情
  • 不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧
  • 使用Visual Studio Code编写和激活ABAP代码
  • 你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧
  • 在SAP云平台ABAP编程环境上编写第一段ABAP程序
  • SAP官方发布的ABAP编程规范
  • ABAP Code Inspector那些隐藏的功能,您都知道吗?
  • 还在用ABAP进行SAP产品的二次开发?来了解下这种全新的二次开发理念吧
  • ABAP Netweaver体内的那些寄生式编程语言
  • 从SAP社区上的一篇博客开始,聊聊SAP产品命名背后的那份情怀
  • 云端的ABAP Restful服务开发
  • 如何在SAP云平台ABAP编程环境里把CDS view暴露成OData服务
  • 使用abapGit在ABAP On-Premises系统和SAP云平台ABAP环境之间进行代码传输
  • 30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用
  • Jerry带您了解Restful ABAP Programming模型系列之二:Action和Validation的实现
  • Jerry带您了解Restful ABAP Programming模型系列之三:云端ABAP应用调试
  • SAP云平台上的ABAP编程环境里如何消费第三方服务
  • ABAP开发者上云的时候到了 - 现在大家可以免费使用SAP云平台ABAP环境的试用版了
  • 学而不思则罔 - SAP云平台ABAP编程环境的由来和适用场景
  • SAP云平台里的三叉戟应用
  • 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用
  • SAP 2019 TechEd Key Note解读:云时代下SAP从业人员如何做二次开发?
  • 有哪些ABAP关键字和语法,到了ABAP云环境上就没办法用了?
  • ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了
  • 利用ABAP 740的新关键字REDUCE完成一个实际工作任务
  • 一段让人瑟瑟发抖的ABAP代码
  • 昨日万圣节ABAP怪兽级代码谜团,公布答案啦
  • 介绍一种在ABAP内核态进行内表高效拷贝的方法
  • 使用SAP Cloud Application Programming模型开发OData的一个实际例子
  • 当ABAP遇见普罗米修斯
  • 使用ABAP绘制可伸缩矢量图
  • ABAP开发环境语法高亮的那些事儿
  • SAP错误消息调试之七种武器:让所有的错误消息都能被定位
  • 使用ABAP操作Excel的几种方法
  • SAP GUI里的收藏夹事务码管理工具
  • SAP GUI和Windows注册表
  • 有了Debug权限就能干坏事?小心了,你的一举一动尽在系统监控中
  • ABAP CCDEF, CCIMP, CCMAC, CCAU, CMXXX这些东东是什么鬼
  • 实现ABAP条件断点的三种方式
  • 使用SAT跟踪监控从浏览器打开的SAP应用的性能和调用栈
  • 一个13年ABAP老兵的建议:了解这些基础知识,对ABAP开发有百利而无一害
  • SAP ABAP Netweaver容器化, 不可能完成的任务吗?
  • SAP产品增强技术回顾
  • SAP API开发方法大全
  • 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP面向切面编程的尝试
  • SAP ABAP应用服务器的HTTP响应状态码(Status Code)
  • SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下
  • ABAP面试题系列:写一组会出现死锁(Deadlock)的ABAP程序
  • SAP ABAP Netweaver服务器的标准登录方式讲解
  • SAP ABAP关键字语法图和ABAP代码自动生成工具Code Composer
  • SAP ABAP SM50的另类用途 - ABAP工作进程对数据库表读取操作的检测
  • 关于SAP ABAP字符变量和字符串变量字符个数的一个知识点,和一个血案
  • SAP ABAP一组关键字 IS BOUND, IS NOT INITIAL和IS ASSIGNED的用法辨析
  • SAP ABAP和Java里的弱引用(WeakReference)和软引用(SoftReference)
  • SAP AMDP介绍 - ABAP托管的HANA数据库过程
  • 给你的ABAP对象打上标签(Tag)
  • 历史上的今天:编程语言中null引用的十亿美元错误
  • ABAP Development Tool 代码模板和其他一些实用技巧汇总
  • SAP ABAP Development Tool 提高开发效率的十个小技巧

更多Jerry的原创文章,尽在:“汪子熙”:

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