SAP OData編程指南

OData(Open Data Protocol)協議是一個開放的工業標準,用於定義RESTFul API的設計和使用。個人文章標題前加上SAP的前綴,只是爲了代表這篇文章介紹的是Jerry在SAP項目開發中使用到OData的一些心得和經驗。javascript

目前OData被普遍用於SAP Business Suite和SAP S/4HANA的衆多Fiori應用中,以及SAP Customer Engagement Center和一些正在開發的新一代雲產品中。此外OData也是SAP Cloud for Customer推薦的一種將C4C和客戶第三方應用集成的技術手段。關於這種集成方式,在個人另外一篇文章裏有所介紹:java

SAP S4CRM vs C4C, 諸葛亮和周瑜?android

本文會從OData服務的實現和消費這兩個方面來介紹,目錄以下:git

  • 在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開發github

以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的修改建立操做,請按照個人另外兩篇博客去實現:

值得一提的是,在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作過的三個維度的分析:

C4C中的OData應用

Jerry作過的C4C客戶項目中對OData使用的一些分享:

XS OData Services

HANA Studio裏開發的HANA view也能經過HANA Extended Application Service暴露成OData服務。

據個人成都同事介紹,SAP Customer Engagement Center採用的就是這種方式。

更多介紹參考這篇SAP博客:

HANA Development: XS OData Services

更多閱讀

全部更多閱讀的連接都已經分佈在文章的每一章節,這裏爲閱讀方便起見,將部分連接再次統一羅列以下:

要獲取更多Jerry的原創技術文章,請關注公衆號"汪子熙".