摘要:目前被廣泛用于和的眾多應(yīng)用中,以及和一些正在開發(fā)的新一代云產(chǎn)品中。年月時,我和德國一位負責(zé)的同事就這個話題在半小時的電話會議里產(chǎn)生了爭執(zhí)。德國同事看了之后,同意了我的意見。和微信集成系列教程這個系列教程里,和微信的交互,使用了,使用了。
OData(Open Data Protocol)協(xié)議是一個開放的工業(yè)標(biāo)準(zhǔn),用于定義RESTFul API的設(shè)計和使用。我的文章標(biāo)題前加上SAP的前綴,只是為了表明這篇文章介紹的是Jerry在SAP項目開發(fā)中使用到OData的一些心得和經(jīng)驗。
目前OData被廣泛用于SAP Business Suite和SAP S/4HANA的眾多Fiori應(yīng)用中,以及SAP Customer Engagement Center和一些正在開發(fā)的新一代云產(chǎn)品中。此外OData也是SAP Cloud for Customer推薦的一種將C4C和客戶第三方應(yīng)用集成的技術(shù)手段。關(guān)于這種集成方式,在我的另一篇文章里有所介紹:
SAP S4CRM vs C4C, 諸葛亮和周瑜?
本文會從OData服務(wù)的實現(xiàn)和消費這兩個方面來介紹,目錄如下:
在SAP Business Suite中進行OData開發(fā)
在SAP S/4HANA中進行OData開發(fā)
使用ABAP代碼消費OData服務(wù)
使用Java代碼 + Apache Olingo消費OData服務(wù)
使用UI5消費OData服務(wù)
OData性能測試
C4C中的OData應(yīng)用
XS OData Services
更多閱讀
*
在SAP Business Suite中進行OData開發(fā)
以SAP CRM為例。SAP對于很多Fiori應(yīng)用都貼心地提供了可以云端試用的版本,通過如下鏈接訪問:
https://www.sapfioritrial.com/
點擊鏈接之后,在Fiori Launchpad里能看到CRM目錄下存在若干Tile,它們是SAP成都研究院CRM Fiori開發(fā)團隊負責(zé)開發(fā)和維護的,Jerry也曾經(jīng)是這個團隊的一員。隨便點擊一個Tile, 比如My Opportunities:
然后我們能看到該應(yīng)用的明細頁面了。在Chrome開發(fā)者工具的Network標(biāo)簽頁,我們能觀察到一個對于metadata的請求:
關(guān)于Chrome開發(fā)者工具的使用技巧,Jerry曾經(jīng)做過整理,多帶帶寫在另一篇文章里:
Jerry和您聊聊Chrome開發(fā)者工具
我們把這個metadata請求的url從Chrome開發(fā)者工具里拷貝出來,完整鏈接如下:
https://www.sapfioritrial.com...$metadata?sap-language=en&sap-client=001
直接在瀏覽器里訪問這個鏈接,就能觀察到包含在鏈接里名為CRM_OPPORTUNITY的OData服務(wù)的metadata(元數(shù)據(jù))。我們可以把一個OData服務(wù)的模型類比成一個SAP Business Object,該模型同樣由一個根節(jié)點和若干子節(jié)點組成,每個節(jié)點包含若干字段。某些節(jié)點提供了一些可以執(zhí)行的邏輯,在OData協(xié)議里稱這些邏輯為function import(相當(dāng)于Business Object里的action)。不同節(jié)點之間通過定義Navigation建立關(guān)聯(lián)關(guān)系——SAP基于Netweaver的不同產(chǎn)品的建模方式思路都類似,可以觸類旁通。
另一個重要的請求:
https://www.sapfioritrial.com...$skip=0&$top=20&$inlinecount=allpages&sap-client=001
在Jerry的另一篇文章?SAP UI 搜索分頁技術(shù)?里已經(jīng)對這個請求做過分析:
$skip=0&$top=20:通知后臺執(zhí)行分頁搜索,只將滿足查詢條件的前20條記錄從數(shù)據(jù)庫取出,返回給UI。
$inlinecount=allpages:?返回數(shù)據(jù)庫滿足搜索條件的記錄數(shù)。因為Jerry未指定搜索條件,所以返回系統(tǒng)里Opportunity的總個數(shù)1051。
下面簡單介紹SAP Business Suite系統(tǒng)里如何開發(fā)OData模型和服務(wù)。
在動手開發(fā)前,我們需要先溫習(xí)Fiori的架構(gòu)。
在我的文章?SAP Fiori應(yīng)用的三種部署方式里提到過這張圖:
談到Fiori開發(fā)時,就這張圖而言,可以總結(jié)成兩句話:
1. 在ABAP Back-End服務(wù)器上做OData模型和服務(wù)的開發(fā)
2. 在ABAP Front-End服務(wù)器上做OData服務(wù)的注冊,以便讓Fiori應(yīng)用能夠消費
首先我們到ABAP Back-End服務(wù)器上,使用事務(wù)碼SEGW打開CRM_OPPORTUNITY這個OData服務(wù)。可以看到Data Model里包含了很多節(jié)點,每個節(jié)點實際上由一個ABAP DDIC Structure實現(xiàn),節(jié)點上的每個字段對應(yīng)著Structure上的字段。我們定義好OData模型包含哪些Structure之后,點擊工具欄的Generate Runtime Objects按鈕:
SAP Gateway框架就會基于我們定義的OData模型,自動生成4個ABAP類和兩個模型。
MPC和MPC_EXT:當(dāng)消費者訪問該服務(wù)的metadata時,這兩個類負責(zé)把通過ABAP DDIC Structure描述的metadata信息轉(zhuǎn)換成OData協(xié)議規(guī)范的格式并返回。每次開發(fā)人員修改OData模型,點擊Generate按鈕后,MPC的代碼都會重新生成。如果開發(fā)人員需要在模型上添加一些額外信息,比如一些版本控制信息或者相關(guān)注解(annotation),那么需要在MPC_EXT里通過ABAP代碼實現(xiàn)。MPC_EXT是MPC的子類,其代碼不會被Generate按鈕覆蓋。一個例子如下:
DPC和DPC_EXT:包含了OData服務(wù)的實現(xiàn),實際上也就是基于OData模型的CRUD操作,搜索操作和function import的實現(xiàn)。以O(shè)pportunity為例,因為該模型底層使用的是CRM One Order模型,所以DPC_EXT里包含了大量CRM_ORDER_*等函數(shù)調(diào)用,CRM顧問朋友們對這些函數(shù)應(yīng)該非常熟悉。
在ABAP Back-End服務(wù)器做好OData開發(fā)后,登陸ABAP Front-End服務(wù)器,使用事務(wù)碼/IWFND/MAINT_SERVICE將后臺服務(wù)器做好的OData服務(wù)進行注冊。
下圖是OData服務(wù)在ABAP Front-End服務(wù)器的注冊界面。從下圖能看出理論上一臺ABAP Front-End服務(wù)器可以連接多臺ABAP Back-End服務(wù)器,
SAP把這種1:N的關(guān)系稱為Multiple Origin Composition,典型的使用場景比如一家跨國企業(yè),其美洲分公司的應(yīng)用運行于Back-End服務(wù)器1,歐洲分公司位于Back-End服務(wù)器2。一個銷售經(jīng)理使用Fiori應(yīng)用查看該企業(yè)某個時間段內(nèi)全球的銷售數(shù)據(jù),則其OData實現(xiàn)會將這兩臺服務(wù)器的后臺數(shù)據(jù)搜集起來,進行匯總并返回給UI。具體細節(jié)請參考SAP幫助文檔:
https://help.sap.com/doc/saph...
關(guān)于SEGW更多開發(fā)細節(jié),可以參考我的SAP同事環(huán)宇的公眾號文章:
十分鐘手把手系列之SEGW Project入門
環(huán)宇有一個名為Fiori的公眾號,介紹的全是Fiori知識。感興趣的朋友可以關(guān)注一下。
在S/4HANA中進行OData開發(fā)
在我的公眾號文章?Hello World, S/4HANA for Customer Management 1.0?里提到,CDS view是S/4HANA里一個重要的建模方式。
我們還是來看個具體的例子。假設(shè)需要在S/4HANA里開發(fā)一個管理Service Order的Fiori應(yīng)用,功能暫定為支持對Service Order的只讀操作,即查詢和瀏覽。借助S/4HANA的CDS view建模技術(shù),我們不需要寫一行JavaScript,就可以自動生成一個滿足需求的Fiori應(yīng)用,聽起來是不是很神奇?
我們需要創(chuàng)建一個CDS view,用它來自動生成OData的模型和服務(wù),即下圖綠色的Z_C_Service_Order_View。該View又從其他更底層的CDS view取數(shù)據(jù),將Service Order的抬頭,行項目,狀態(tài)信息等數(shù)據(jù)聚合在一起。
CDS view開發(fā)完畢后,只需要在事務(wù)碼SEGW里將其通過Reference->Data Source加載進去:
就可以自動生成OData模型,以及前一章節(jié)提到的MPC和DPC各兩套一共4個ABAP Class,分別對應(yīng)下圖藍色和紅色區(qū)域所示,無需應(yīng)用開發(fā)人員再寫ABAP代碼。
然后用SAP WebIDE創(chuàng)建一個新的Fiori應(yīng)用,注意創(chuàng)建時不要使用普通的SAPUI5 Application模板,而采用Smart Template Application模板。在創(chuàng)建向?qū)Ю镏付ㄖ盎贑DS view自動生成的OData服務(wù)。
點擊向?qū)У腇inish按鈕,最終不用寫一行JavaScript代碼,就得到這樣一個Fiori應(yīng)用:
上圖提到的CDS view的源代碼,以及Smart Template的工作原理,都在我的博客里:
Create a CRM Service Order Fiori application within a couple of minutes
更進一步,如果想給這個自動生成的Fiori應(yīng)用增添一些功能,例如支持對Service Order的修改和創(chuàng)建操作,請按照我的另外兩篇博客去實現(xiàn):
Enable CRM Service Order application with edit functionality
Enable CRM Service Order application with create functionality
值得一提的是,在CDS view里有一個強大的注解:
@OData.publish: true
和SpringBoot的注解能實現(xiàn)很多神奇的功能一樣,被該注解定義過的CDS view,能夠不借助SEGW的幫助,自動生成OData模型和服務(wù),進一步簡化了開發(fā)人員做OData開發(fā)需要的配置,有助于開發(fā)人員快速構(gòu)建出標(biāo)準(zhǔn)化的OData服務(wù)。
@OData.publish這個注解的實現(xiàn)原理,請參考我的CDS view自學(xué)教程系列的第4部分:
Part 4 how does annotation @OData.publish work
OData服務(wù)的消費
前面說了這么多都是OData模型和服務(wù)的開發(fā),現(xiàn)在來談?wù)勅绾蜗M。
使用ABAP代碼消費OData服務(wù)
以消費C4C Opportunity的標(biāo)準(zhǔn)OData服務(wù)為例。
首先在postman里搞清楚如何使用HTTP Post加上OData的$batch操作來創(chuàng)建Opportunity:
其實最主要的工作量就是把$batch操作的一整套流程用ABAP代碼實現(xiàn)。$batch請求的body通過下圖代碼里insert_line這個自定義宏操作的一系列字符串去填充。
因為ABAP Netweaver既可作為Web Server,又可作為Web Client,所以使用ABAP代碼消費OData這種RESTFul API,實質(zhì)上是利用了IF_HTTP_CLIENT的SEND和RECEIVE方法,進行網(wǎng)絡(luò)請求的發(fā)送和接收。
我在SAP Community上寫過一個用ABAP代碼消費OData服務(wù)的教程:
Consume standard C4C OData service via ABAP code
使用Java代碼 + Apache Olingo消費OData服務(wù)
相信大多數(shù)開發(fā)人員都不愿意像下面的代碼這樣直接操作OData $batch body,既麻煩又容易出錯。
于是在Java里就有了Apache Olingo,一個開源庫,您可以把它當(dāng)成OData的Java SDK,封裝了OData底層的細節(jié)。$batch操作需要填充的BatchChangeSet和BatchChangeSetPart在Olingo里都有了對應(yīng)的類進行封裝,看看下圖使用Java代碼調(diào)用OData服務(wù)進行ServiceTicket 的創(chuàng)建,和上圖ABAP代碼進行比較,是不是從語義上看清晰了很多?
上圖的完整Java代碼,參考我的github
使用UI5消費OData服務(wù)
在SAP UI5官網(wǎng)上能找到詳細的API說明。
Jerry只補充兩點原創(chuàng)內(nèi)容。
1. UI5 OData API的同步和異步參數(shù)。
2015年6月時,我和德國一位負責(zé)Quality的同事就這個話題在半小時的電話會議里產(chǎn)生了爭執(zhí)。因為時間有限,我沒能在電話里說服他,所以就有了這篇博客。德國同事看了之后,同意了我的意見。具體細節(jié)參考博客:
A Test on Fiori OData request Synchronous mode VS Asynchronous mode
下圖是5個請求以同步模式發(fā)出在Chrome開發(fā)者工具Network標(biāo)簽頁中觀察到的時序:
下圖是5個請求以異步模式發(fā)出:
2. 在SAP云平臺的CloudFoundry環(huán)境下消費ABAP On-Premise OData服務(wù)
場景:在微信里消費On-Premise系統(tǒng)的OData服務(wù)。
詳細步驟已經(jīng)在我之前的微信公眾號文章介紹過了。
OData性能測試
1. 使用Netweaver提供的性能測試工具
詳細介紹參考我的博客:
How to find OData performance trace and payload trace functionality
2. 使用JMeter測試OData服務(wù)在高并發(fā)場景下的性能指標(biāo)
在Jerry工作過的客戶項目里,很多客戶提出了這種性能測試要求,比如同時發(fā)起1000個Service Request的OData創(chuàng)建請求,測量其平均響應(yīng)時間。
Jerry在這兩篇博客里介紹了兩種辦法:
(1) 自己寫Java代碼,用多線程編程技術(shù),每個線程發(fā)起一個OData創(chuàng)建請求,自己度量平均響應(yīng)時間。
(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,用于將業(yè)務(wù)數(shù)據(jù)從后臺系統(tǒng)抽取出來,保存于設(shè)備本地的離線存儲區(qū)域。
關(guān)于其工作原理,參考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應(yīng)用
Jerry做過的C4C客戶項目中對OData使用的一些分享:
Leverage C4C Odata notification to monitor C4C Opportunity change in CRM system
使用場景:在C4C創(chuàng)建業(yè)務(wù)數(shù)據(jù)后,利用這篇博客介紹的用法,能自動發(fā)送一個通知給其他系統(tǒng)/應(yīng)用。可以作為一種輕量級的系統(tǒng)集成方案。
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實現(xiàn)的自定義邏輯暴露給第三方應(yīng)用。
C4C和微信集成系列教程
這個系列教程里,C4C和微信的交互,60%使用了C4C OData,40%使用了C4C Web Service。
XS OData Services
HANA Studio里開發(fā)的HANA view也能通過HANA Extended Application Service暴露成OData服務(wù)。
據(jù)我的成都同事介紹,SAP Customer Engagement Center采用的就是這種方式。
更多介紹參考這篇SAP博客:
HANA Development: XS OData Services
更多閱讀
所有更多閱讀的鏈接都已經(jīng)分布在文章的每一章節(jié),這里為閱讀方便起見,將部分鏈接再次統(tǒng)一羅列如下:
SAP UI 搜索分頁技術(shù)
[](http://mp.weixin.qq.com/s?__b...
在SAP云平臺的CloudFoundry環(huán)境下消費ABAP On-Premise OData服務(wù)
Jerry和您聊聊Chrome開發(fā)者工具
C4C和微信集成系列教程
Jerry的UI5框架代碼自學(xué)教程
SAP Fiori應(yīng)用的三種部署方式
Jerry的Fiori原創(chuàng)文章合集
Hello World, S/4HANA for Customer Management 1.0
SAP UI和Salesforce UI開發(fā)漫談
SAP S4CRM vs C4C, 諸葛亮和周瑜?
那些年我用過的SAP IDE
要獲取更多Jerry的原創(chuàng)技術(shù)文章,請關(guān)注公眾號"汪子熙".
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/95656.html
摘要:目前被廣泛用于和的眾多應(yīng)用中,以及和一些正在開發(fā)的新一代云產(chǎn)品中。年月時,我和德國一位負責(zé)的同事就這個話題在半小時的電話會議里產(chǎn)生了爭執(zhí)。德國同事看了之后,同意了我的意見。和微信集成系列教程這個系列教程里,和微信的交互,使用了,使用了。 OData(Open Data Protocol)協(xié)議是一個開放的工業(yè)標(biāo)準(zhǔn),用于定義RESTFul API的設(shè)計和使用。我的文章標(biāo)題前加上SAP的前綴...
摘要:這是年的第篇文章,也是汪子熙公眾號總共第篇原創(chuàng)文章。使用通過格式發(fā)送和文件到服務(wù)器關(guān)于格式的詳細說明,參考開發(fā)社區(qū)和的文檔我在前文例子的基礎(chǔ)上稍作修改在里使用兩個類型為的標(biāo)簽,分別上傳和文件用來測試的本地文件,大小為字節(jié)。 這是 Jerry 2021 年的第 71 篇文章,也是汪子熙公眾號總共第 348 篇原創(chuàng)文章。 Jerry 之前發(fā)布過一篇文章 不使用任何框架,手寫純 Jav...
摘要:小的時候,聽過牛頓這樣謙虛的一句話如果說我看得比別人更遠些,那是因為我站在巨人的肩膀上。。發(fā)布一個的事件,事件包含創(chuàng)建訂單的字段。 這周Jerry在SAP上海研究院參加了一個為期4天的Kubernetes培訓(xùn),度過了忙碌而又充實的4天。Jason,Benny和Peng三位大神的培訓(xùn)干貨滿滿,借此機會,Jerry和過去的兩位老領(lǐng)導(dǎo)Patrick和Evan敘了敘舊,也拜見了上海SAP圈子里...
摘要:小的時候,聽過牛頓這樣謙虛的一句話如果說我看得比別人更遠些,那是因為我站在巨人的肩膀上。。發(fā)布一個的事件,事件包含創(chuàng)建訂單的字段。 這周Jerry在SAP上海研究院參加了一個為期4天的Kubernetes培訓(xùn),度過了忙碌而又充實的4天。Jason,Benny和Peng三位大神的培訓(xùn)干貨滿滿,借此機會,Jerry和過去的兩位老領(lǐng)導(dǎo)Patrick和Evan敘了敘舊,也拜見了上海SAP圈子里...
閱讀 1474·2019-08-30 15:55
閱讀 1176·2019-08-30 15:52
閱讀 1296·2019-08-29 13:53
閱讀 1472·2019-08-29 11:19
閱讀 2976·2019-08-26 13:29
閱讀 536·2019-08-26 11:33
閱讀 2597·2019-08-23 17:20
閱讀 1028·2019-08-23 14:14