SAP OData编程指南

简介: SAP OData编程指南

OData(Open Data Protocol)协议是一个开放的工业标准,用于定义RESTFul API的设计和使用。我的文章标题前加上SAP的前缀,只是为了表明这篇文章介绍的是Jerry在SAP项目开发中使用到OData的一些心得和经验。


image.png


目前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应用都贴心地提供了可以云端试用的版本,通过如下链接访问:


https://www.sapfioritrial.com/


点击链接之后,在Fiori Launchpad里能看到CRM目录下存在若干Tile,它们是SAP成都研究院CRM Fiori开发团队负责开发和维护的,Jerry也曾经是这个团队的一员。随便点击一个Tile, 比如My Opportunities:



image.png

然后我们能看到该应用的明细页面了。在Chrome开发者工具的Network标签页,我们能观察到一个对于metadata的请求:


image.png


关于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的不同产品的建模方式思路都类似,可以触类旁通。

image.png



另一个重要的请求:


https://www.sapfioritrial.com/sap/opu/odata/sap/CRM_OPPORTUNITY/Opportunities?KaTeX parse error: Expected 'EOF', got '&' at position 7: skip=0&̲top=20&$inlinecount=allpages&sap-client=001

image.png



在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应用的三种部署方式里提到过这张图:


image.png


谈到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按钮:



image.png

SAP Gateway框架就会基于我们定义的OData模型,自动生成4个ABAP类和两个模型。



image.png

**MPC和MPC_EXT:**当消费者访问该服务的metadata时,这两个类负责把通过ABAP DDIC Structure描述的metadata信息转换成OData协议规范的格式并返回。每次开发人员修改OData模型,点击Generate按钮后,MPC的代码都会重新生成。如果开发人员需要在模型上添加一些额外信息,比如一些版本控制信息或者相关注解(annotation),那么需要在MPC_EXT里通过ABAP代码实现。MPC_EXT是MPC的子类,其代码不会被Generate按钮覆盖。一个例子如下:


image.png


**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服务器,


image.png


SAP把这种1:N的关系称为Multiple Origin Composition,典型的使用场景比如一家跨国企业,其美洲分公司的应用运行于Back-End服务器1,欧洲分公司位于Back-End服务器2。一个销售经理使用Fiori应用查看该企业某个时间段内全球的销售数据,则其OData实现会将这两台服务器的后台数据搜集起来,进行汇总并返回给UI。具体细节请参考SAP帮助文档:


https://help.sap.com/doc/saphelp_hba/1.0/en-US/dd/f1ceb93a7d48fab4aa16efebc90e02/frameset.htm


关于SEGW更多开发细节,可以参考我的SAP同事环宇的公众号文章:


十分钟手把手系列之SEGW Project入门


环宇有一个名为Fiori的公众号,介绍的全是Fiori知识。感兴趣的朋友可以关注一下。


image.png


在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的抬头,行项目,状态信息等数据聚合在一起。


image.png


CDS view开发完毕后,只需要在事务码SEGW里将其通过Reference->Data Source加载进去:



image.png

就可以自动生成OData模型,以及前一章节提到的MPC和DPC各两套一共4个ABAP Class,分别对应下图蓝色和红色区域所示,无需应用开发人员再写ABAP代码。


image.png


然后用SAP WebIDE创建一个新的Fiori应用,注意创建时不要使用普通的SAPUI5 Application模板,而采用Smart Template Application模板。在创建向导里指定之前基于CDS view自动生成的OData服务。



image.png

点击向导的Finish按钮,最终不用写一行JavaScript代码,就得到这样一个Fiori应用:


image.png


上图提到的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服务。

image.png



@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:


image.png


其实最主要的工作量就是把b a t c h 操 作 的 一 整 套 流 程 用 A B A P 代 码 实 现 。 batch操作的一整套流程用ABAP代码实现。batch操作的一整套流程用ABAP代码实现。batch请求的body通过下图代码里insert_line这个自定义宏操作的一系列字符串去填充。


image.png


因为ABAP Netweaver既可作为Web Server,又可作为Web Client,所以使用ABAP代码消费OData这种RESTFul API,实质上是利用了IF_HTTP_CLIENT的SEND和RECEIVE方法,进行网络请求的发送和接收。



image.png

我在SAP Community上写过一个用ABAP代码消费OData服务的教程:


Consume standard C4C OData service via ABAP code


使用Java代码 + Apache Olingo消费OData服务


相信大多数开发人员都不愿意像下面的代码这样直接操作OData $batch body,既麻烦又容易出错。

image.png



于是在Java里就有了Apache Olingo,一个开源库,您可以把它当成OData的Java SDK,封装了OData底层的细节。$batch操作需要填充的BatchChangeSet和BatchChangeSetPart在Olingo里都有了对应的类进行封装,看看下图使用Java代码调用OData服务进行ServiceTicket 的创建,和上图ABAP代码进行比较,是不是从语义上看清晰了很多?



image.png

上图的完整Java代码,参考我的github


使用UI5消费OData服务


在SAP UI5官网上能找到详细的API说明。


image.png


Jerry只补充两点原创内容。


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



image.pngimage.png



2015年6月时,我和德国一位负责Quality的同事就这个话题在半小时的电话会议里产生了争执。因为时间有限,我没能在电话里说服他,所以就有了这篇博客。德国同事看了之后,同意了我的意见。具体细节参考博客:


A Test on Fiori OData request Synchronous mode VS Asynchronous mode


下图是5个请求以同步模式发出在Chrome开发者工具Network标签页中观察到的时序:


image.png


下图是5个请求以异步模式发出:


image.png


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


场景:在微信里消费On-Premise系统的OData服务。


image.png


详细步骤已经在我之前的微信公众号文章介绍过了。


OData性能测试


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


image.png


详细介绍参考我的博客:


How to find OData performance trace and payload trace functionality


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


在Jerry工作过的客户项目里,很多客户提出了这种性能测试要求,比如同时发起1000个Service Request的OData创建请求,测量其平均响应时间。


Jerry在这两篇博客里介绍了两种办法:


(1) 自己写Java代码,用多线程编程技术,每个线程发起一个OData创建请求,自己度量平均响应时间。


(2) 使用性能测试神器JMeter,这样一行代码都不用写。


image.png


两种办法的具体介绍参考我的博客:


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,用于将业务数据从后台系统抽取出来,保存于设备本地的离线存储区域。


image.png


关于其工作原理,参考Jerry做过的三个维度的分析:


How is OData request routed to Offline data store by Odata offline plugin


How is JavaScript code in OData offline plugin delegated to native Java code in Android


How is OData offline store opened in Android platform


C4C中的OData应用


Jerry做过的C4C客户项目中对OData使用的一些分享:


Leverage C4C Odata notification to monitor C4C Opportunity change in CRM system


使用场景:在C4C创建业务数据后,利用这篇博客介绍的用法,能自动发送一个通知给其他系统/应用。可以作为一种轻量级的系统集成方案。


Expose TextCollection data belonging to a Custom BO via OData service


该解决方案我提供给了一个Chinese C4C客户。


Expose Custom BO logic implemented by ABSL via Custom OData service


通过OData将用ABSL实现的自定义逻辑暴露给第三方应用。


C4C和微信集成系列教程


这个系列教程里,C4C和微信的交互,60%使用了C4C OData,40%使用了C4C Web Service。


XS OData Services


HANA Studio里开发的HANA view也能通过HANA Extended Application Service暴露成OData服务。


据我的成都同事介绍,SAP Customer Engagement Center采用的就是这种方式。


更多介绍参考这篇SAP博客:


HANA Development: XS OData Services


相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
相关文章
|
1月前
|
Web App开发 Java 测试技术
SAP OData 编程指南
SAP OData 编程指南
|
1月前
关于 SAP ABAP OData 服务如何实现 Deep Insert 场景 - SAP 应用的标准行为试读版
关于 SAP ABAP OData 服务如何实现 Deep Insert 场景 - SAP 应用的标准行为试读版
16 1
|
1月前
什么是 SAP ABAP 里的 Subscreen
什么是 SAP ABAP 里的 Subscreen
16 1
什么是 SAP ABAP 里的 Subscreen
|
7月前
|
存储
什么是 SAP ABAP 服务器的 Addon
什么是 SAP ABAP 服务器的 Addon
52 0
|
7月前
|
存储 数据挖掘 大数据
什么是 SAP ABAP AMDP?
什么是 SAP ABAP AMDP?
65 0
|
7月前
|
BI 图形学
什么是 SAP ABAP 的 HPGL
什么是 SAP ABAP 的 HPGL
47 0
|
7月前
|
XML SQL JavaScript
使用纯 ABAP 开发 SAP UI5 之一:概述
使用纯 ABAP 开发 SAP UI5 之一:概述
52 0
|
7月前
|
存储 JavaScript 前端开发
使用纯 ABAP 开发 SAP UI5 应用(一):abap2UI5 开发环境搭建介绍
使用纯 ABAP 开发 SAP UI5 应用(一):abap2UI5 开发环境搭建介绍
101 2
|
8月前
|
测试技术
SAP ABAP OData 服务里 EntityType 和 EntitySet 的区别试读版
SAP ABAP OData 服务里 EntityType 和 EntitySet 的区别试读版
40 0
|
8月前
|
测试技术
如何使用 ABAP 程序消费 SAP ABAP OData 服务
正如本教程的开篇介绍文章SAP OData 开发教程 - 从入门到提高(包含 SEGW, RAP 和 CDP)所提到的,SAP OData 服务开发,从实现技术上来说,可以分为三大类。因此本教程也分为三大部分,分别进行介绍。本文是本教程的文章目录。
62 0