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和客户第三方应用集成的技术手段。关于这种集成方式,在我的另一篇文章里有所介绍:
本文会从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:
然后我们能看到该应用的明细页面了。在Chrome开发者工具的Network标签页,我们能观察到一个对于metadata的请求:
关于Chrome开发者工具的使用技巧,Jerry曾经做过整理,单独写在另一篇文章里:
我们把这个metadata请求的url从Chrome开发者工具里拷贝出来,完整链接如下:
直接在浏览器里访问这个链接,就能观察到包含在链接里名为CRM_OPPORTUNITY的OData服务的metadata(元数据)。我们可以把一个OData服务的模型类比成一个SAP Business Object,该模型同样由一个根节点和若干子节点组成,每个节点包含若干字段。某些节点提供了一些可以执行的逻辑,在OData协议里称这些逻辑为function import(相当于Business Object里的action)。不同节点之间通过定义Navigation建立关联关系——SAP基于Netweaver的不同产品的建模方式思路都类似,可以触类旁通。
另一个重要的请求:
在Jerry的另一篇文章 SAP UI 搜索分页技术 里已经对这个请求做过分析:
-
$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帮助文档:
https://help.sap.com/doc/saphelp_hba/1.0/en-US/dd/f1ceb93a7d48fab4aa16efebc90e02/frameset.htm
关于SEGW更多开发细节,可以参考我的SAP同事环宇的公众号文章:
环宇有一个名为Fiori的公众号,介绍的全是Fiori知识。感兴趣的朋友可以关注一下。
在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:
其实最主要的工作量就是把$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个请求以异步模式发出:
2. 在SAP云平台的CloudFoundry环境下消费ABAP On-Premise OData服务
场景:在微信里消费On-Premise系统的OData服务。
详细步骤已经在我之前的微信公众号文章介绍过了。
OData性能测试
1. 使用Netweaver提供的性能测试工具
详细介绍参考我的博客:
How to find OData performance trace and payload trace functionality
2. 使用JMeter测试OData服务在高并发场景下的性能指标
在Jerry工作过的客户项目里,很多客户提出了这种性能测试要求,比如同时发起1000个Service Request的OData创建请求,测量其平均响应时间。
Jerry在这两篇博客里介绍了两种办法:
(1) 自己写Java代码,用多线程编程技术,每个线程发起一个OData创建请求,自己度量平均响应时间。
(2) 使用性能测试神器JMeter,这样一行代码都不用写。
两种办法的具体介绍参考我的博客:
Kapsel OData plugin原理讲解
SAP移动解决方案的Offline(离线)模式使用了Kapsel OData plugin,用于将业务数据从后台系统抽取出来,保存于设备本地的离线存储区域。
关于其工作原理,参考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
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和微信的交互,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
更多阅读
所有更多阅读的链接都已经分布在文章的每一章节,这里为阅读方便起见,将部分链接再次统一罗列如下:
要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:
相关推荐
为了实现SAP NetWeaver Gateway服务开发,开发者需要对SAP技术栈有一定的了解,包括SAP NetWeaver、ABAP编程语言以及OData协议的细节。同时,由于OData服务可以跨越多个平台和编程语言,因此在实现时还需要考虑如何...
SAP Core OData Processor API是SAP开发的一个关键组件,它主要用于处理OData(Open Data Protocol)服务的实现,这是一种基于RESTful架构的数据访问协议,广泛应用于企业级应用程序,特别是那些基于云服务的系统。...
8. **SAP Gateway**:它是连接SAP系统和外部应用程序的桥梁,通过OData协议提供服务。理解如何使用SAP Gateway创建和发布服务,对于构建集成解决方案至关重要。 9. **版本管理和变更控制**:在SAP环境中,理解如何...
SAP ABAP(Advanced Business Application Programming)是SAP公司开发的一种编程语言,主要用于构建和定制企业级业务应用程序。本用户指南将深入探讨SAP ABAP的核心概念、语法和实际应用,帮助用户掌握如何在SAP...
这份“sap中abap编程资料”包含的[SAP] SAP BC ABAP Programming.pdf文档,无疑是对SAP ABAP编程的一份详尽指南。以下是基于这个主题的详细知识点: 1. **ABAP概述**:ABAP是SAP NetWeaver平台的核心组件,用于构建...
总的来说,《实战SAP程序开发——从实例学SAP ABAP编程》是一本全面且实用的指南,涵盖了SAP ABAP开发的各个层面,无论你是初学者还是有一定经验的开发者,都能从中受益,提升自己的SAP开发技能。通过跟随教程的步骤...
7. 设计原则和最佳实践:SAP Fiori提供了一套设计指南,这些指南涵盖了用户体验(UX)和用户界面(UI)设计的最佳实践。了解这些设计原则能够帮助开发者创建符合SAP Fiori标准的用户友好的应用。 SAPUI5的开发不...
- **API和SDK**:掌握SAP HANA云提供的API和SDK,如XSJS、OData服务的开发和调用。 - **数据可视化**:了解如何使用D3.js或其他JavaScript库创建交互式图表和报告。 - **持续集成/持续部署(CI/CD)**:理解如何使用...
ABAP(Advanced Business Application Programming)是SAP公司开发的一种编程语言,主要用于开发和扩展SAP系统。这篇“ABAP培训教材”旨在为初学者提供一个全面的入门指南,同时也适合作为培训课程的参考资料。 一...
而"SAP-abap-e5afb9sape7b3bbe7bb9fe5bc80e58f91e4b8ade69687e79a84e680bbe7bb93.pdf"这个名字暗示了这是一份关于ABAP编程的综合指南,可能详细介绍了ABAP的高级特性,如报表编写、屏幕设计、数据库访问以及Web服务...
此外,对于SAP的Web服务、OData协议和SAPUI5框架的理解也是必要的,因为这些可能会在自定义组件中被用到。 总的来说,SAP Custom Widget-1是一个定制的JavaScript解决方案,用于扩展和优化SAP环境中的用户体验。...
5. **OData服务**:UI5与OData协议紧密集成,使得与后端系统的数据交互变得更加简单,尤其适合与SAP系统集成。 【Fiori设计原则】 1. **角色驱动**:Fiori应用程序根据用户角色定制,提供与角色相关的关键任务。 ...
4. **SAP Gateway**:是SAP系统中提供OData服务的关键组件,它可以将后端系统的业务逻辑转换为可供前端应用消费的OData服务。 5. **SAP UI5**:SAP UI5是Fiori应用的主要开发框架,它基于HTML5,提供了丰富的控件库...
【标签】:“JavaScript”表明这个项目的核心编程语言是JavaScript,SAPUI5正是基于JavaScript构建的,它利用了jQuery、HTML5和CSS3等现代Web技术,提供了一套完整的开发工具集,包括模型、视图、控制器(MVC)架构...
标题中提到的“使用指南及示例”暗示了本资料将提供对Power BI 操作的具体指导,包含入门教程和不同案例分析。描述部分明确说明了内容包括了快速入门、基本概念以及多种实际案例的展示。标签“Power”指向了Power BI...