SAP OData 编程指南

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: SAP OData 编程指南

OData(Open Data Protocol)协议是一个开放的工业标准,用于定义RESTFul API的设计和使用。我的文章标题前加上SAP的前缀,只是为了表明这篇文章介绍的是Jerry在SAP项目开发中使用到OData的一些心得和经验。
目前OData被广泛用于SAP Business Suite和SAP S/4HANA的众多Fiori应用中,以及SAP Customer Engagement Center和一些正在开发的新一代云产品中。此外OData也是SAP Cloud for Customer推荐的一种将C4C和客户第三方应用集成的技术手段。关于这种集成方式,在我的另一篇文章里有所介绍:
SAP S4CRM vs C4C, 诸葛亮和周瑜?
本文会从OData服务的实现和消费这两个方面来介绍,目录如下:
• 在SAP Business Suite中进行OData开发
• 在SAP S/4HANA中进行OData开发
• 使用ABAP代码消费OData服务
• 使用Java代码 + Apache Olingo消费OData服务
• 使用UI5消费OData服务
• OData性能测试
• C4C中的OData应用
• XS OData Services
• 更多阅读
在SAP Business Suite中进行OData开发
以SAP CRM为例。SAP对于很多Fiori应用都贴心地提供了可以云端试用的版本,通过这个链接访问。
点击链接之后,在Fiori Launchpad里能看到CRM目录下存在若干Tile,它们是SAP成都研究院CRM Fiori开发团队负责开发和维护的,Jerry也曾经是这个团队的一员。随便点击一个Tile, 比如My Opportunities:
然后我们能看到该应用的明细页面了。在Chrome开发者工具的Network标签页,我们能观察到一个对于metadata的请求:
关于Chrome开发者工具的使用技巧,Jerry曾经做过整理,单独写在另一篇文章里:
Jerry和您聊聊Chrome开发者工具
我们把这个metadata请求的url从Chrome开发者工具里拷贝出来,完整链接如下:
https://www.sapfioritrial.com/sap/opu/odata/sap/CRM_OPPORTUNITY/$metadata?sap-language=en&sap-client=001
直接在浏览器里访问这个链接,就能观察到包含在链接里名为CRM_OPPORTUNITY的OData服务的metadata(元数据)。我们可以把一个OData服务的模型类比成一个SAP Business Object,该模型同样由一个根节点和若干子节点组成,每个节点包含若干字段。某些节点提供了一些可以执行的逻辑,在OData协议里称这些逻辑为function import(相当于Business Object里的action)。不同节点之间通过定义Navigation建立关联关系——SAP基于Netweaver的不同产品的建模方式思路都类似,可以触类旁通。
另一个重要的请求:
https://www.sapfioritrial.com/sap/opu/odata/sap/CRM_OPPORTUNITY/Opportunities?$skip=0&$top=20&$inlinecount=allpages&sap-client=001
在Jerry的另一篇文章 SAP UI 搜索分页技术 里已经对这个请求做过分析:
KaTeX parse error: Expected 'EOF', got '&' at position 7: skip=0&̲top=20:通知后台执行分页搜索,只将满足查询条件的前20条记录从数据库取出,返回给UI。
• $inlinecount=allpages: 返回数据库满足搜索条件的记录数。因为Jerry未指定搜索条件,所以返回系统里Opportunity的总个数1051。
下面简单介绍SAP Business Suite系统里如何开发OData模型和服务。
在动手开发前,我们需要先温习Fiori的架构。
在我的文章 SAP Fiori应用的三种部署方式里提到过这张图:
谈到Fiori开发时,就这张图而言,可以总结成两句话:

  1. 在ABAP Back-End服务器上做OData模型和服务的开发
  2. 在ABAP Front-End服务器上做OData服务的注册,以便让Fiori应用能够消费

首先我们到ABAP Back-End服务器上,使用事务码SEGW打开CRM_OPPORTUNITY这个OData服务。可以看到Data Model里包含了很多节点,每个节点实际上由一个ABAP DDIC Structure实现,节点上的每个字段对应着Structure上的字段。我们定义好OData模型包含哪些Structure之后,点击工具栏的Generate Runtime Objects按钮:
SAP Gateway框架就会基于我们定义的OData模型,自动生成4个ABAP类和两个模型。
MPC和MPC_EXT:当消费者访问该服务的metadata时,这两个类负责把通过ABAP DDIC Structure描述的metadata信息转换成OData协议规范的格式并返回。每次开发人员修改OData模型,点击Generate按钮后,MPC的代码都会重新生成。如果开发人员需要在模型上添加一些额外信息,比如一些版本控制信息或者相关注解(annotation),那么需要在MPC_EXT里通过ABAP代码实现。MPC_EXT是MPC的子类,其代码不会被Generate按钮覆盖。一个例子如下:
DPC和DPC_EXT:包含了OData服务的实现,实际上也就是基于OData模型的CRUD操作,搜索操作和function import的实现。以Opportunity为例,因为该模型底层使用的是CRM One Order模型,所以DPC_EXT里包含了大量CRM_ORDER_*等函数调用,CRM顾问朋友们对这些函数应该非常熟悉。
在ABAP Back-End服务器做好OData开发后,登陆ABAP Front-End服务器,使用事务码/IWFND/MAINT_SERVICE将后台服务器做好的OData服务进行注册。
下图是OData服务在ABAP Front-End服务器的注册界面。从下图能看出理论上一台ABAP Front-End服务器可以连接多台ABAP Back-End服务器,
SAP把这种1:N的关系称为Multiple Origin Composition,典型的使用场景比如一家跨国企业,其美洲分公司的应用运行于Back-End服务器1,欧洲分公司位于Back-End服务器2。一个销售经理使用Fiori应用查看该企业某个时间段内全球的销售数据,则其OData实现会将这两台服务器的后台数据搜集起来,进行汇总并返回给UI。具体细节请参考SAP帮助文档:
关于SEGW更多开发细节,可以参考我的SAP同事环宇的公众号文章:
十分钟手把手系列之SEGW Project入门
在S/4HANA中进行OData开发
在我的公众号文章 Hello World, S/4HANA for Customer Management 1.0 里提到,CDS view是S/4HANA里一个重要的建模方式。
我们还是来看个具体的例子。假设需要在S/4HANA里开发一个管理Service Order的Fiori应用,功能暂定为支持对Service Order的只读操作,即查询和浏览。借助S/4HANA的CDS view建模技术,我们不需要写一行JavaScript,就可以自动生成一个满足需求的Fiori应用,听起来是不是很神奇?
我们需要创建一个CDS view,用它来自动生成OData的模型和服务,即下图绿色的Z_C_Service_Order_View。该View又从其他更底层的CDS view取数据,将Service Order的抬头,行项目,状态信息等数据聚合在一起。
CDS view开发完毕后,只需要在事务码SEGW里将其通过Reference->Data Source加载进去:
就可以自动生成OData模型,以及前一章节提到的MPC和DPC各两套一共4个ABAP Class,分别对应下图蓝色和红色区域所示,无需应用开发人员再写ABAP代码。
然后用SAP WebIDE创建一个新的Fiori应用,注意创建时不要使用普通的SAPUI5 Application模板,而采用Smart Template Application模板。在创建向导里指定之前基于CDS view自动生成的OData服务。
点击向导的Finish按钮,最终不用写一行JavaScript代码,就得到这样一个Fiori应用:
上图提到的CDS view的源代码,以及Smart Template的工作原理,都在我的博客里:
Create a CRM Service Order Fiori application within a couple of minutes
更进一步,如果想给这个自动生成的Fiori应用增添一些功能,例如支持对Service Order的修改和创建操作,请按照我的另外两篇博客去实现:
• Enable CRM Service Order application with edit functionality
• Enable CRM Service Order application with create functionality
值得一提的是,在CDS view里有一个强大的注解:
@OData.publish: true
和SpringBoot的注解能实现很多神奇的功能一样,被该注解定义过的CDS view,能够不借助SEGW的帮助,自动生成OData模型和服务,进一步简化了开发人员做OData开发需要的配置,有助于开发人员快速构建出标准化的OData服务。
@OData.publish这个注解的实现原理,请参考我的CDS view自学教程系列的第4部分:
Part 4 how does annotation @OData.publish work
OData服务的消费
前面说了这么多都是OData模型和服务的开发,现在来谈谈如何消费。
使用ABAP代码消费OData服务
以消费C4C Opportunity的标准OData服务为例。
首先在postman里搞清楚如何使用HTTP Post加上OData的$batch操作来创建Opportunity:
其实最主要的工作量就是把b a t c h 操 作 的 一 整 套 流 程 用 A B A P 代 码 实 现 。 batch操作的一整套流程用ABAP代码实现。batch操作的一整套流程用ABAP代码实现。batch请求的body通过下图代码里insert_line这个自定义宏操作的一系列字符串去填充。
因为ABAP Netweaver既可作为Web Server,又可作为Web Client,所以使用ABAP代码消费OData这种RESTFul API,实质上是利用了IF_HTTP_CLIENT的SEND和RECEIVE方法,进行网络请求的发送和接收。
我在SAP Community上写过一个用ABAP代码消费OData服务的教程:
Consume standard C4C OData service via ABAP code
使用Java代码 + Apache Olingo消费OData服务
相信大多数开发人员都不愿意像下面的代码这样直接操作OData $batch body,既麻烦又容易出错。
于是在Java里就有了Apache Olingo,一个开源库,您可以把它当成OData的Java SDK,封装了OData底层的细节。$batch操作需要填充的BatchChangeSet和BatchChangeSetPart在Olingo里都有了对应的类进行封装,看看下图使用Java代码调用OData服务进行ServiceTicket 的创建,和上图ABAP代码进行比较,是不是从语义上看清晰了很多?
上图的完整Java代码,参考我的github
使用UI5消费OData服务
在SAP UI5官网上能找到详细的API说明。
Jerry只补充两点原创内容。

  1. UI5 OData API的同步和异步参数。

2015年6月时,我和德国一位负责Quality的同事就这个话题在半小时的电话会议里产生了争执。因为时间有限,我没能在电话里说服他,所以就有了这篇博客。德国同事看了之后,同意了我的意见。具体细节参考博客:
A Test on Fiori OData request Synchronous mode VS Asynchronous mode
下图是5个请求以同步模式发出在Chrome开发者工具Network标签页中观察到的时序:
下图是5个请求以异步模式发出:

  1. 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务

场景:在微信里消费On-Premise系统的OData服务。
详细步骤已经在我之前的微信公众号文章介绍过了。
OData性能测试

  1. 使用Netweaver提供的性能测试工具

详细介绍参考我的博客:
How to find OData performance trace and payload trace functionality

  1. 使用JMeter测试OData服务在高并发场景下的性能指标

在Jerry工作过的客户项目里,很多客户提出了这种性能测试要求,比如同时发起1000个Service Request的OData创建请求,测量其平均响应时间。
Jerry在这两篇博客里介绍了两种办法:
(1) 自己写Java代码,用多线程编程技术,每个线程发起一个OData创建请求,自己度量平均响应时间。
(2) 使用性能测试神器JMeter,这样一行代码都不用写。
两种办法的具体介绍参考我的博客:
• JMeter beginner – how to use JMeter to measure performance of OData service accessed parallelly
• OData service parallel performance measurement – how to deal with XSRF token in Java Program and JMeter
Kapsel OData plugin原理讲解
SAP移动解决方案的Offline(离线)模式使用了Kapsel OData plugin,用于将业务数据从后台系统抽取出来,保存于设备本地的离线存储区域。

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
SAP MM/FI_运费处理方式
常见的采购运费处理方式
SAP MM 途损处理方式
通常客户采购业务需求提到货物运输有损耗,需要针对此业务给出合理方案输出,下面笔者针对此类业务分析下各种实现方案的可行性!
SAP MM初阶之事务代码MIGO界面批次拆分最多输入15行?
SAP MM初阶之事务代码MIGO界面批次拆分最多输入15行?
SAP MM初阶之事务代码MIGO界面批次拆分最多输入15行?
SAP MM不常用移动类型之325
SAP MM不常用移动类型之325
SAP MM不常用移动类型之325
SAP MM初阶之采购信息记录里的Prior Supplier栏位
SAP MM初阶之采购信息记录里的Prior Supplier栏位
SAP MM初阶之采购信息记录里的Prior Supplier栏位
SAP MM初阶之ME12里为啥只能维护少量条件类型的价格?
SAP MM初阶之ME12里为啥只能维护少量条件类型的价格?
SAP MM初阶之ME12里为啥只能维护少量条件类型的价格?
SAP MM 采购信息记录里的Automatic Sourcing 之二
SAP MM 采购信息记录里的Automatic Sourcing 之二
SAP MM 采购信息记录里的Automatic Sourcing 之二
SAP MM初阶之没有定义Access Sequence的条件类型不能使用MEK1维护条件记录
SAP MM初阶之没有定义Access Sequence的条件类型不能使用MEK1维护条件记录
SAP MM初阶之没有定义Access Sequence的条件类型不能使用MEK1维护条件记录
SAP MM 采购信息记录里的Automatic Sourcing
SAP MM 采购信息记录里的Automatic Sourcing
SAP MM 采购信息记录里的Automatic Sourcing