OData(开放数据协议)协议是一个开放的行业标准,用于定义RESTFulAPI的设计和使用。在我的文章标题前加上SAP的前缀,只是为了表明这篇文章介绍了Jerry在SAP项目开发中使用OData的一些心得和体会。目前,OData广泛应用于SAPBusinessSuite和SAPS/4HANA的众多Fiori应用,以及SAPCustomerEngagementCenter和一些正在开发的新一代云产品中。此外,OData也是SAPCloudforCustomer推荐的一种集成C4C和客户第三方应用的技术手段。关于这种集成方式,我在另一篇文章中有介绍:SAPS4CRMvsC4C,诸葛亮与周瑜?本文将介绍OData服务的实现和消费。目录如下:在SAPBusinessSuiteODatadevelopmentinSAPS/4HANAConsumingODataservicesusingABAPcodeConsumingODataservicesusingJavacode+ApacheOlingoConsumingODataservicesusingUI5ConsumingODataservicesODataperformancetestingODataapplicationsinC4CXSODataServices更多阅读*inSAPODataBusinessSuite中的开发以SAPCRM为例。对于很多Fiori应用,SAP贴心地提供了可以在云端试用的版本。通过以下链接访问:https://www.sapfioritrial.com/点击链接后,可以看到FioriLaunchpad中的CRM目录下有几个Tile。由SAP成都研究院CRMFiori开发团队开发维护,Jerry曾是该团队成员。只需点击一个Tile,比如MyOpportunities:然后我们就可以看到申请的详情页。在Chrome开发者工具的Network选项卡上,我们可以观察到一个对元数据的请求:关于Chrome开发者工具的使用技巧,Jerry已经整理出来单独写在另一篇文章:Jerry跟你聊聊Chrome开发者工具我们从Chrome开发者工具中复制这个元数据请求的url,完整链接如下:https://www.sapfioritrial.com...$metadata?sap-language=en&sap-client=001直接浏览如果访问这个链接在浏览器中,您可以观察到链接中包含的名为CRM_OPPORTUNITY的OData服务的元数据(metadata)。我们可以把一个OData服务的模型比作一个SAPBusinessObject,同样由一个根节点和若干个子节点组成,每个节点又包含若干字段。某些节点提供了一些可执行的逻辑,在OData协议中称为functionimport(相当于BusinessObject中的action)。通过定义Navigation建立不同节点之间的关联——SAP针对不同产品的基于Netweaver的建模方法大同小异,可以类推。另一个重要的请求:https://www.sapfioritrial.com...$skip=0&$top=20&$inlinecount=allpages&sap-client=001在Jerry的另一篇SAPUI搜索分页技术中已经对这个请求进行了分析:$skip=0&$top=20:通知后台进行分页查找,只从数据库中取出满足查询条件的前20条记录返回给UI。$inlinecount=allpages:返回数据库中符合搜索条件的记录数。因为Jerry没有指定搜索条件,所以系统中的Opportunities总数为1051。下面简单介绍如何在SAPBusinessSuite系统中开发OData模型和服务。在开始开发之前,我们需要回顾一下Fiori的结构。我在我的文章《SAPFiori应用的三种部署方式:Fiori开发》中提到过这张图,就这张图来说,可以用两句话来概括:1.在ABAPBack-End服务器上做OData模型和服务的开发2.在ABAPFront-End服务器上注册OData服务,以便Fiori应用程序可以消费。首先,我们到ABAPBack-End服务器,使用事务码SEGW打开OData服务CRM_OPPORTUNITY。可以看出,DataModel包含了很多节点,每个节点实际上都是由一个ABAPDDICStructure实现的,节点上的每个字段对应Structure上的一个字段。在我们定义好OData模型包含哪些结构之后,点击工具栏上的GenerateRuntimeObjects按钮:SAPGateway框架会根据我们定义的OData模型自动生成4个ABAP类和2个模型。MPC和MPC_EXT:当消费者访问服务的元数据时,这两个类负责将ABAPDDICStructure描述的元数据信息转换为OData协议规范的格式并返回。开发者每次修改OData模型,点击Generate按钮,都会重新生成MPC代码。如果开发者需要给模型添加一些额外的信息,比如一些版本控制信息或者相关的注解(annotation),那么就需要通过MPC_EXT中的ABAP代码来实现。MPC_EXT是MPC的子类,其代码不会被生成按钮覆盖。示例如下:DPC和DPC_EXT:包含OData服务的实现,实际上是基于OData模型的CRUD操作、搜索操作和函数导入的实现。以Opportunity为例,由于模型底层采用CRMOneOrder模型,DPC_EXT中包含大量CRM_ORDER_*等函数调用。CRM顾问朋友们应该对这些功能非常熟悉了。ABAPBack-End服务器完成OData开发后,登录ABAPFront-End服务器,使用事务码/IWFND/MAINT_SERVICE注册后台服务器准备的OData服务。下图是ABAPFront-End服务器上OData服务的注册界面。从下图可以看出,理论上一台ABAPFront-End服务器可以连接多台ABAPBack-End服务器。SAP将此1:N关系称为多源组合。一个典型的使用场景是一家跨国企业,其美国分公司的应用运行在后台服务器1上,欧洲分公司的应用运行在后台服务器2上,销售经理使用Fiori应用查看全球销售数据公司在一定时间内,其OData实现会收集两台服务器的后台数据,汇总后返回给UI。详细可以参考SAP帮助文档:https://help.sap.com/doc/saph...更多关于SEGW的开发可以参考我SAP同事环宇的公众号文章:SEGW在十分钟动手系列中,Universal中有一个名为Fiori的公众号,介绍了所有Fiori知识。感兴趣的朋友可以看看。S/4HANA中的OData开发正如我的公众号文章HelloWorld,S/4HANAforCustomerManagement1.0中提到的,CDS视图是S/4HANA中的一个重要的建模方法。让我们看一个具体的例子。假设需要在S/4HANA中开发一个管理ServiceOrder的Fiori应用,功能暂定为支持对ServiceOrder的只读操作,即查询和浏览。借助S/4HANA的CDS视图建模技术,我们无需编写一行JavaScript,就可以自动生成符合要求的Fiori应用。听起来很棒吗?我们需要创建一个CDS视图,并用它来自动生成OData模型和服务,也就是下图中绿色的Z_C_Service_Order_View。该视图从其他较低级别的CDS视图中获取数据,并聚合服务订单标题、行项目、状态信息和其他数据。CDS视图开发完成后,只需要在事务代码SEGW中通过Reference->DataSource加载即可:OData模型可以自动生成,还有上一章提到的两套MPC和DPC,一个一共4个ABAPClasses,分别对应下图中的蓝色和红色区域,无需应用开发者编写ABAP代码。然后使用SAPWebIDE创建一个新的Fiori应用程序。创建时注意不要使用普通的SAPUI5Application模板,而是使用SmartTemplateApplication模板。在创建向导中指定根据CDS视图自动生成的OData服务。点击向导的Finish按钮,一行JavaScript代码都没有写,终于得到了这样一个Fiori应用:上图中提到的CDS视图的源码,SmartTemplate的工作原理都在我的博客中:在几分钟内创建一个CRM服务订单Fiori应用程序更进一步。如果你想给这个自动生成的Fiori应用添加一些功能,比如支持修改和创建ServiceOrder,请按照我另外两篇博客来实现:EnableCRMServiceOrderapplicationwitheditfunctionalityEnableCRMServiceOrderapplicationwithcreatefunctionality它值得一提的是,CDS视图中有一个强大的注解:@OData.publish:true,SpringBoot注解可以实现很多神奇的功能,通过注解定义的CDS视图可以在不借助SEGW的情况下自动生成OData模型和服务,进一步简化开发者进行OData开发所需的配置,帮助开发者快速构建标准化的OData服务。@OData.publish注解的实现原理可以参考我的CDS视图自学教程系列第4篇:第4篇@OData.publish注解如何工作OData服务消费上面说了这么多,OData的开发就这么多模型和服务,下面我们来说说如何消费。使用ABAP代码消费OData服务以C4COpportunity的标准OData服务为例。首先弄清楚postman中如何使用HTTPPost加上OData的$batch操作来创建Opportunity:其实主要的工作量是用ABAP代码实现$batch操作的整个过程。$batch请求的主体填充了下面代码中自定义宏操作insert_line的一系列字符串。因为ABAPNetweaver既可以作为WebServer,也可以作为WebClient,使用ABAP代码消费OData这个RESTFulAPI,本质上是使用IF_HTTP_CLIENT的SEND和RECEIVE方法来发送和接收网络请求。我在SAPCommunity上写了一篇关于使用ABAP代码使用OData服务的教程:ConsumestandardC4CODataserviceviaABAPcodeUseJavacode+ApacheOlingotoconsumeODataservices。相信大多数开发者都不愿意像下面的代码$batchbody那样直接操作OData,既麻烦又容易出错。于是就有了Java中的ApacheOlingo这个开源库,你可以把它作为OData的JavaSDK来使用,它封装了OData底层的细节。$batch操作中需要填写的BatchChangeSet和BatchChangeSetPart在Olingo中都有相应的类进行封装。看下图使用Java代码调用OData服务创建ServiceTicket。对比上图中的ABAP代码,是不是从语义上看?清楚多了?上图中完整的Java代码可以参考我的github使用UI5消费OData服务,在SAPUI5官网可以找到详细的API说明。Jerry只增加了两点原创内容。1、UI5ODataAPI的同步和异步参数。2015年6月,我和一位在德国的质量同事在一个半小时的电话会议上就这个话题争论不休。由于时间限制,我无法通过电话说服他,因此写了这篇博文。我的德国同事读完后同意我的看法。具体可以参考博客:ATestonFioriODatarequest同步模式VS异步模式下图是同步模式发送5个请求的时序。在Chrome开发者工具的Network选项卡中观察到的时序:下图是异步方式发送的5个请求:2.在SAP云平台的CloudFoundry环境中ConsumeABAPOn-PremiseOData服务场景:ConsumeODataservicesoftheOn-微信前置系统。详细步骤在我之前的微信公众号文章中有介绍。OData性能测试1、使用Netweaver提供的性能测试工具,有详细介绍。参考我的博客:如何找到OData性能跟踪和payloadtrace功能2.使用JMeter测试高并发场景下OData服务的性能指标Jerry在客户项目上工作过很多客户提出了这种性能测试需求,比如如同时发起1000个ServiceRequest的OData创建请求,并测量它们的平均响应时间。Jerry在这两篇博客中介绍了两种方法:(1)自己写Java代码,使用多线程编程技术,每个线程发起一个OData创建请求,自己测量平均响应时间。(2)使用性能测试神器JMeter,一行代码都不用写。两种方法的具体介绍可以参考我的博客:JMeter初学者-如何使用JMeter测量OData服务访问parallelOData服务的性能并行性能测量-Java程序中如何处理XSRFtoken和JMeterKapselOData插件SAP移动解决方案原理详解Offline(离线)模式使用KapselOData插件从后台系统中提取业务数据,保存在设备本地离线存储区。其工作原理参考Jerry的立体分析:OData离线插件如何将OData请求路由到Offlinedatastore如何在Android中将OData离线插件中的JavaScript代码委托给nativeJava代码如何在Android中开启OData离线存储OData在platformC4C中的应用Jerry分享Jerry做的C4C客户项目中的OData使用:利用C4COdata通知监控CRM系统中的C4C机会变化使用场景:在C4C中创建业务数据后,使用本博客介绍的用法,能够自动向其他系统/应用程序发送通知。它可以作为一个轻量级的系统集成解决方案。通过OData服务公开属于自定义BO的TextCollection数据我向中国C4C客户提供了此解决方案。公开由ABSL通过自定义OData服务实现的自定义BO逻辑通过OData服务将使用ABSL实现的自定义逻辑公开给第三方应用程序。C4C与微信集成系列教程本系列教程中,C4C与微信的交互60%使用C4COData,40%使用C4CWebService。在XSODataServicesHANAStudio中开发的HANA视图也可以通过HANA扩展应用程序服务公开为OData服务。据成都同事介绍,SAPCustomerEngagementCenter采用的就是这种方式。更多介绍可以参考这篇SAP博客:HANADevelopment:XSODataServicesReadMore所有的阅读链接都分布在文章的各个章节中。为方便阅读,部分链接再次列出如下:SAPUISearchPagingTechnology[](http://mp.weixin.qq.com/s?__b...在CloudFoundry中使用ABAPOn-PremiseODataServiceSAPCloudPlatform环境Jerry给你讲讲ChromeDeveloperToolC4CIntegrationwithWeChat系列教程Jerry的UI5框架代码自学教程SAPFiori应用的三种部署方式Jerry的Fiori原创文章合集HelloWorld,S/4HANAforCustomerManagement1.0SAPUI与SalesforceUI开发说说SAPS4CRMvsC4C,诸葛亮和周瑜?那些年我用过的SAPIDE想看更多Jerry的原创技术文章,请关注公众号“汪子熙”。
