互聯(lián)網(wǎng)協(xié)議 — TCP — 擁塞控制(網(wǎng)絡質(zhì)量保障)">互聯(lián)網(wǎng)協(xié)議 — TCP — 擁塞控制(網(wǎng)絡質(zhì)量保障)
1383
2022-05-30
OData(Open Data Protocol)協(xié)議是一個開放的工業(yè)標準,用于定義RESTFul API的設計和使用。我的文章標題前加上SAP的前綴,只是為了表明這篇文章介紹的是Jerry在SAP項目開發(fā)中使用到OData的一些心得和經(jīng)驗。
目前OData被廣泛用于SAP Business Suite和SAP S/4HANA的眾多Fiori應用中,以及SAP Customer Engagement Center和一些正在開發(fā)的新一代云產(chǎn)品中。此外OData也是SAP Cloud for Customer推薦的一種將C4C和客戶第三方應用集成的技術(shù)手段。關于這種集成方式,在我的另一篇文章里有所介紹:
SAP S4CRM vs C4C, 諸葛亮和周瑜?
本文會從OData服務的實現(xiàn)和消費這兩個方面來介紹,目錄如下:
在SAP Business Suite中進行OData開發(fā)
在SAP S/4HANA中進行OData開發(fā)
使用ABAP代碼消費OData服務
使用Java代碼 + Apache Olingo消費OData服務
使用UI5消費OData服務
OData性能測試
C4C中的OData應用
XS OData Services
更多閱讀
在SAP Business Suite中進行OData開發(fā)
以SAP CRM為例。SAP對于很多Fiori應用都貼心地提供了可以云端試用的版本,通過如下鏈接訪問:
https://www.sapfioritrial.com/
點擊鏈接之后,在Fiori Launchpad里能看到CRM目錄下存在若干Tile,它們是SAP成都研究院CRM Fiori開發(fā)團隊負責開發(fā)和維護的,Jerry也曾經(jīng)是這個團隊的一員。隨便點擊一個Tile, 比如My Opportunities:
然后我們能看到該應用的明細頁面了。在Chrome開發(fā)者工具的Network標簽頁,我們能觀察到一個對于metadata的請求:
關于Chrome開發(fā)者工具的使用技巧,Jerry曾經(jīng)做過整理,單獨寫在另一篇文章里:
Jerry和您聊聊Chrome開發(fā)者工具
我們把這個metadata請求的url從Chrome開發(fā)者工具里拷貝出來,完整鏈接如下:
https://www.sapfioritrial.com/sap/opu/odata/sap/CRM_OPPORTUNITY/$metadata?sap-language=en&sap-client=001
直接在瀏覽器里訪問這個鏈接,就能觀察到包含在鏈接里名為CRM_OPPORTUNITY的OData服務的metadata(元數(shù)據(jù))。我們可以把一個OData服務的模型類比成一個SAP Business Object,該模型同樣由一個根節(jié)點和若干子節(jié)點組成,每個節(jié)點包含若干字段。某些節(jié)點提供了一些可以執(zhí)行的邏輯,在OData協(xié)議里稱這些邏輯為function import(相當于Business Object里的action)。不同節(jié)點之間通過定義Navigation建立關聯(lián)關系——SAP基于Netweaver的不同產(chǎn)品的建模方式思路都類似,可以觸類旁通。
另一個重要的請求:
https://www.sapfioritrial.com/sap/opu/odata/sap/CRM_OPPORTUNITY/Opportunities?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模型和服務。
在動手開發(fā)前,我們需要先溫習Fiori的架構(gòu)。
在我的文章 SAP Fiori應用的三種部署方式里提到過這張圖:
談到Fiori開發(fā)時,就這張圖而言,可以總結(jié)成兩句話:
1. 在ABAP Back-End服務器上做OData模型和服務的開發(fā)
2. 在ABAP Front-End服務器上做OData服務的注冊,以便讓Fiori應用能夠消費
首先我們到ABAP Back-End服務器上,使用事務碼SEGW打開CRM_OPPORTUNITY這個OData服務。可以看到Data Model里包含了很多節(jié)點,每個節(jié)點實際上由一個ABAP DDIC Structure實現(xiàn),節(jié)點上的每個字段對應著Structure上的字段。我們定義好OData模型包含哪些Structure之后,點擊工具欄的Generate Runtime Objects按鈕:
SAP Gateway框架就會基于我們定義的OData模型,自動生成4個ABAP類和兩個模型。
**MPC和MPC_EXT:**當消費者訪問該服務的metadata時,這兩個類負責把通過ABAP DDIC Structure描述的metadata信息轉(zhuǎn)換成OData協(xié)議規(guī)范的格式并返回。每次開發(fā)人員修改OData模型,點擊Generate按鈕后,MPC的代碼都會重新生成。如果開發(fā)人員需要在模型上添加一些額外信息,比如一些版本控制信息或者相關注解(annotation),那么需要在MPC_EXT里通過ABAP代碼實現(xiàn)。MPC_EXT是MPC的子類,其代碼不會被Generate按鈕覆蓋。一個例子如下:
**DPC和DPC_EXT:**包含了OData服務的實現(xiàn),實際上也就是基于OData模型的CRUD操作,搜索操作和function import的實現(xiàn)。以Opportunity為例,因為該模型底層使用的是CRM One Order模型,所以DPC_EXT里包含了大量CRM_ORDER_*等函數(shù)調(diào)用,CRM顧問朋友們對這些函數(shù)應該非常熟悉。
在ABAP Back-End服務器做好OData開發(fā)后,登陸ABAP Front-End服務器,使用事務碼**/IWFND/MAINT_SERVICE**將后臺服務器做好的OData服務進行注冊。
下圖是OData服務在ABAP Front-End服務器的注冊界面。從下圖能看出理論上一臺ABAP Front-End服務器可以連接多臺ABAP Back-End服務器,
SAP把這種1:N的關系稱為Multiple Origin Composition,典型的使用場景比如一家跨國企業(yè),其美洲分公司的應用運行于Back-End服務器1,歐洲分公司位于Back-End服務器2。一個銷售經(jīng)理使用Fiori應用查看該企業(yè)某個時間段內(nèi)全球的銷售數(shù)據(jù),則其OData實現(xiàn)會將這兩臺服務器的后臺數(shù)據(jù)搜集起來,進行匯總并返回給UI。具體細節(jié)請參考SAP幫助文檔:
https://help.sap.com/doc/saphelp_hba/1.0/en-US/dd/f1ceb93a7d48fab4aa16efebc90e02/frameset.htm
關于SEGW更多開發(fā)細節(jié),可以參考我的SAP同事環(huán)宇的公眾號文章:
十分鐘手把手系列之SEGW Project入門
環(huán)宇有一個名為Fiori的公眾號,介紹的全是Fiori知識。感興趣的朋友可以關注一下。
在S/4HANA中進行OData開發(fā)
在我的公眾號文章 Hello World, S/4HANA for Customer Management 1.0 里提到,CDS view是S/4HANA里一個重要的建模方式。
我們還是來看個具體的例子。假設需要在S/4HANA里開發(fā)一個管理Service Order的Fiori應用,功能暫定為支持對Service Order的只讀操作,即查詢和瀏覽。借助S/4HANA的CDS view建模技術(shù),我們不需要寫一行JavaScript,就可以自動生成一個滿足需求的Fiori應用,聽起來是不是很神奇?
我們需要創(chuàng)建一個CDS view,用它來自動生成OData的模型和服務,即下圖綠色的Z_C_Service_Order_View。該View又從其他更底層的CDS view取數(shù)據(jù),將Service Order的抬頭,行項目,狀態(tài)信息等數(shù)據(jù)聚合在一起。
CDS view開發(fā)完畢后,只需要在事務碼SEGW里將其通過Reference->Data Source加載進去:
就可以自動生成OData模型,以及前一章節(jié)提到的MPC和DPC各兩套一共4個ABAP Class,分別對應下圖藍色和紅色區(qū)域所示,無需應用開發(fā)人員再寫ABAP代碼。
然后用SAP WebIDE創(chuàng)建一個新的Fiori應用,注意創(chuàng)建時不要使用普通的SAPUI5 Application模板,而采用Smart Template Application模板。在創(chuàng)建向?qū)Ю镏付ㄖ盎贑DS view自動生成的OData服務。
點擊向?qū)У腇inish按鈕,最終不用寫一行JavaScript代碼,就得到這樣一個Fiori應用:
上圖提到的CDS view的源代碼,以及Smart Template的工作原理,都在我的博客里:
Create a CRM Service Order Fiori application within a couple of minutes
更進一步,如果想給這個自動生成的Fiori應用增添一些功能,例如支持對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模型和服務,進一步簡化了開發(fā)人員做OData開發(fā)需要的配置,有助于開發(fā)人員快速構(gòu)建出標準化的OData服務。
@OData.publish這個注解的實現(xiàn)原理,請參考我的CDS view自學教程系列的第4部分:
Part 4 how does annotation @OData.publish work
OData服務的消費
前面說了這么多都是OData模型和服務的開發(fā),現(xiàn)在來談談如何消費。
使用ABAP代碼消費OData服務
以消費C4C Opportunity的標準OData服務為例。
首先在postman里搞清楚如何使用HTTP Post加上OData的$batch操作來創(chuàng)建Opportunity:
其實最主要的工作量就是把
b
a
t
c
h
操作的一整套流程用
A
B
A
P
代碼實現(xiàn)。
batch操作的一整套流程用ABAP代碼實現(xiàn)。
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)絡請求的發(fā)送和接收。
我在SAP Community上寫過一個用ABAP代碼消費OData服務的教程:
Consume standard C4C OData service via ABAP code
使用Java代碼 + Apache Olingo消費OData服務
相信大多數(shù)開發(fā)人員都不愿意像下面的代碼這樣直接操作OData $batch body,既麻煩又容易出錯。
于是在Java里就有了Apache Olingo,一個開源庫,您可以把它當成OData的Java SDK,封裝了OData底層的細節(jié)。$batch操作需要填充的BatchChangeSet和BatchChangeSetPart在Olingo里都有了對應的類進行封裝,看看下圖使用Java代碼調(diào)用OData服務進行ServiceTicket 的創(chuàng)建,和上圖ABAP代碼進行比較,是不是從語義上看清晰了很多?
上圖的完整Java代碼,參考我的github
使用UI5消費OData服務
在SAP UI5官網(wǎng)上能找到詳細的API說明。
Jerry只補充兩點原創(chuàng)內(nèi)容。
1. UI5 OData API的同步和異步參數(shù)。
2015年6月時,我和德國一位負責Quality的同事就這個話題在半小時的電話會議里產(chǎn)生了爭執(zhí)。因為時間有限,我沒能在電話里說服他,所以就有了這篇博客。德國同事看了之后,同意了我的意見。具體細節(jié)參考博客:
A Test on Fiori OData request Synchronous mode VS Asynchronous mode
下圖是5個請求以同步模式發(fā)出在Chrome開發(fā)者工具Network標簽頁中觀察到的時序:
下圖是5個請求以異步模式發(fā)出:
2. 在SAP云平臺的CloudFoundry環(huán)境下消費ABAP On-Premise OData服務
場景:在微信里消費On-Premise系統(tǒng)的OData服務。
詳細步驟已經(jīng)在我之前的微信公眾號文章介紹過了。
OData性能測試
1. 使用Netweaver提供的性能測試工具
詳細介紹參考我的博客:
How to find OData performance trace and payload trace functionality
2. 使用JMeter測試OData服務在高并發(fā)場景下的性能指標
在Jerry工作過的客戶項目里,很多客戶提出了這種性能測試要求,比如同時發(fā)起1000個Service Request的OData創(chuàng)建請求,測量其平均響應時間。
Jerry在這兩篇博客里介紹了兩種辦法:
(1) 自己寫Java代碼,用多線程編程技術(shù),每個線程發(fā)起一個OData創(chuà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è)務數(shù)據(jù)從后臺系統(tǒng)抽取出來,保存于設備本地的離線存儲區(qū)域。
關于其工作原理,參考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創(chuàng)建業(yè)務數(shù)據(jù)后,利用這篇博客介紹的用法,能自動發(fā)送一個通知給其他系統(tǒ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)的自定義邏輯暴露給第三方應用。
C4C和微信集成系列教程
這個系列教程里,C4C和微信的交互,60%使用了C4C OData,40%使用了C4C Web Service。
XS OData Services
HANA Studio里開發(fā)的HANA view也能通過HANA Extended Application Service暴露成OData服務。
據(jù)我的成都同事介紹,SAP Customer Engagement Center采用的就是這種方式。
更多介紹參考這篇SAP博客:
HANA Development: XS OData Services
更多閱讀
所有更多閱讀的鏈接都已經(jīng)分布在文章的每一章節(jié),這里為閱讀方便起見,將部分鏈接再次統(tǒng)一羅列如下:
SAP UI 搜索分頁技術(shù)
在SAP云平臺的CloudFoundry環(huán)境下消費ABAP On-Premise OData服務
Jerry和您聊聊Chrome開發(fā)者工具
C4C和微信集成系列教程
Jerry的UI5框架代碼自學教程
SAP Fiori應用的三種部署方式
Jerry的Fiori原創(chuàng)文章合集
Hello World, S/4HANA for Customer Management 1.0
SAP UI和Salesforce UI開發(fā)漫談
SAP S4CRM vs C4C, 諸葛亮和周瑜?
那些年我用過的SAP IDE
ABAP API TCP/IP
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。