摘要:目前被廣泛用于和的眾多應用中,以及和一些正在開發的新一代云產品中。年月時,我和德國一位負責的同事就這個話題在半小時的電話會議里產生了爭執。德國同事看了之后,同意了我的意見。和微信集成系列教程這個系列教程里,和微信的交互,使用了,使用了。
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應用都貼心地提供了可以云端試用的版本,通過如下鏈接訪問:
https://www.sapfioritrial.com/
點擊鏈接之后,在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...$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...$skip=0&$top=20&$inlinecount=allpages&sap-client=001
在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/saph...
關于SEGW更多開發細節,可以參考我的SAP同事環宇的公眾號文章:
十分鐘手把手系列之SEGW Project入門
環宇有一個名為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,這樣一行代碼都不用寫。
兩種辦法的具體介紹參考我的博客:
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,用于將業務數據從后臺系統抽取出來,保存于設備本地的離線存儲區域。
關于其工作原理,參考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
更多閱讀
所有更多閱讀的鏈接都已經分布在文章的每一章節,這里為閱讀方便起見,將部分鏈接再次統一羅列如下:
SAP UI 搜索分頁技術
[](http://mp.weixin.qq.com/s?__b...
在SAP云平臺的CloudFoundry環境下消費ABAP On-Premise OData服務
Jerry和您聊聊Chrome開發者工具
C4C和微信集成系列教程
Jerry的UI5框架代碼自學教程
SAP Fiori應用的三種部署方式
Jerry的Fiori原創文章合集
Hello World, S/4HANA for Customer Management 1.0
SAP UI和Salesforce UI開發漫談
SAP S4CRM vs C4C, 諸葛亮和周瑜?
那些年我用過的SAP IDE
要獲取更多Jerry的原創技術文章,請關注公眾號"汪子熙".
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/95656.html
摘要:目前被廣泛用于和的眾多應用中,以及和一些正在開發的新一代云產品中。年月時,我和德國一位負責的同事就這個話題在半小時的電話會議里產生了爭執。德國同事看了之后,同意了我的意見。和微信集成系列教程這個系列教程里,和微信的交互,使用了,使用了。 OData(Open Data Protocol)協議是一個開放的工業標準,用于定義RESTFul API的設計和使用。我的文章標題前加上SAP的前綴...
摘要:這是年的第篇文章,也是汪子熙公眾號總共第篇原創文章。使用通過格式發送和文件到服務器關于格式的詳細說明,參考開發社區和的文檔我在前文例子的基礎上稍作修改在里使用兩個類型為的標簽,分別上傳和文件用來測試的本地文件,大小為字節。 這是 Jerry 2021 年的第 71 篇文章,也是汪子熙公眾號總共第 348 篇原創文章。 Jerry 之前發布過一篇文章 不使用任何框架,手寫純 Jav...
摘要:小的時候,聽過牛頓這樣謙虛的一句話如果說我看得比別人更遠些,那是因為我站在巨人的肩膀上。。發布一個的事件,事件包含創建訂單的字段。 這周Jerry在SAP上海研究院參加了一個為期4天的Kubernetes培訓,度過了忙碌而又充實的4天。Jason,Benny和Peng三位大神的培訓干貨滿滿,借此機會,Jerry和過去的兩位老領導Patrick和Evan敘了敘舊,也拜見了上海SAP圈子里...
摘要:小的時候,聽過牛頓這樣謙虛的一句話如果說我看得比別人更遠些,那是因為我站在巨人的肩膀上。。發布一個的事件,事件包含創建訂單的字段。 這周Jerry在SAP上海研究院參加了一個為期4天的Kubernetes培訓,度過了忙碌而又充實的4天。Jason,Benny和Peng三位大神的培訓干貨滿滿,借此機會,Jerry和過去的兩位老領導Patrick和Evan敘了敘舊,也拜見了上海SAP圈子里...
閱讀 1480·2019-08-30 15:55
閱讀 1178·2019-08-30 15:52
閱讀 1301·2019-08-29 13:53
閱讀 1473·2019-08-29 11:19
閱讀 2980·2019-08-26 13:29
閱讀 537·2019-08-26 11:33
閱讀 2601·2019-08-23 17:20
閱讀 1031·2019-08-23 14:14