使用 SAP Cloud SDK 连接 OData 服务
Connect to OData service on Neo using SAP Cloud SDK
Virtual Data Model
S/4HANA 系統(tǒng)中存儲的數(shù)據(jù)本質(zhì)上結(jié)構(gòu)復(fù)雜,因此很難手動查詢。因此,HANA 引入了虛擬數(shù)據(jù)模型 (VDM),旨在從這種復(fù)雜性中抽象出來,并以語義上有意義且易于使用的方式提供數(shù)據(jù)。從 S/4HANA 系統(tǒng)使用數(shù)據(jù)的首選方式是通過 OData 協(xié)議。雖然出于兼容性原因也支持 BAPI,但 OData 應(yīng)該始終是您的首選。您可以在 SAP 的 API 業(yè)務(wù)中心找到 S/4HANA Cloud 系統(tǒng)的所有可用 OData 端點的列表。
SAP Cloud SDK 現(xiàn)在將 VDM for OData 引入 Java 世界,使 OData 端點的類型安全使用更加簡單! VDM 是使用來自 SAP API 業(yè)務(wù)中心的信息生成的。這意味著它與 API 業(yè)務(wù)中心提供的每個 API 兼容,因此也與每個 S/4HANA Cloud 系統(tǒng)兼容。
傳統(tǒng)的 OData 服務(wù)訪問方式:
讓我們來看看我們可以編寫的典型代碼來訪問任何使用 SAP Cloud Platform SDK 進行服務(wù)開發(fā)的 OData 服務(wù)。這里,我們從 S/4HANA 系統(tǒng)中檢索業(yè)務(wù)合作伙伴列表:
final ErpConfigContext configContext = new ErpConfigContext(); final List<MyBusinessPartnerType> businessPartners = ODataQueryBuilder.withEntity("/sap/opu/odata/sap/API_BUSINESS_PARTNER","A_BusinessPartner").select("BusinessPartner","LastName","FirstName","IsMale","IsFemale","CreationDate").build().execute(configContext).asList(MyBusinessPartnerType.class);ODataQueryBuilder 代表了一種在應(yīng)用程序中使用 OData 服務(wù)的簡單通用方法,非常適合支持任意服務(wù)。 從手動構(gòu)建到 OData 服務(wù)的 HTTP 請求并在代碼中處理結(jié)果,這是向前邁出的一大步,并且由 SAP Cloud SDK 在內(nèi)部使用。 反過來,ODataQueryBuilder 還使用 SAP Cloud SDK 的概念來簡化與系統(tǒng)的通信,這些系統(tǒng)由 ErpConfigContext 引用。
然而,在使用普通的 ODataQueryBuilder 方法調(diào)用 OData 服務(wù)時,您可能會陷入一些陷阱:
-
對于 .withEntity("/sap/opu/odata/sap/API_BUSINESS_PARTNER", “A_BusinessPartner”) 您已經(jīng)需要知道三件事:OData 端點服務(wù)路徑(/sap/opu/odata/sap)、端點名稱(API_BUSINESS_PARTNER ) 和端點元數(shù)據(jù)中定義的實體集合 (A_BusinessPartner) 的名稱。
-
然后,當(dāng)您想要使用 select() 函數(shù)從 BusinessPartner 實體類型中選擇特定屬性時,您需要知道這些字段是如何命名的。但由于它們在此代碼中僅表示為字符串,因此您需要查看元數(shù)據(jù)以了解它們的調(diào)用方式。這同樣適用于 order() 和 filter() 等函數(shù)。當(dāng)然,使用字符串作為參數(shù)很容易出現(xiàn)拼寫錯誤,您的 IDE 很可能無法為您捕獲這些錯誤。
-
最后,您需要定義一個類,例如 MyBusinessPartnerType,其中包含表示結(jié)果的屬性及其類型的特定注釋。為此,您再次需要了解有關(guān) OData 服務(wù)的大量詳細(xì)信息。
Virtual Data Model: The new way to OData
現(xiàn)在我們已經(jīng)解釋了當(dāng)前方法可能存在的缺陷,讓我們來看看 SAP Cloud SDK 的 OData VDM 如何簡化相同的任務(wù),因為 SDK 能夠整合更多關(guān)于被調(diào)用系統(tǒng)的知識。
final List<BusinessPartner> businessPartners =new DefaultBusinessPartnerService().getAllBusinessPartner().select(BusinessPartner.BUSINESS_PARTNER,BusinessPartner.LAST_NAME,BusinessPartner.FIRST_NAME,BusinessPartner.IS_MALE,BusinessPartner.IS_FEMALE,BusinessPartner.CREATION_DATE).execute();使用 OData VDM,我們現(xiàn)在可以訪問特定 OData 服務(wù)的對象表示,在本例中為 DefaultBusinessPartnerService(BusinessPartnerService 接口的默認(rèn)實現(xiàn))。所以現(xiàn)在不再需要知道端點的服務(wù)路徑、服務(wù)名稱或?qū)嶓w集合名稱。我們可以調(diào)用該服務(wù)的 getAllBusinessPartner() 函數(shù)來從系統(tǒng)中檢索所有業(yè)務(wù)合作伙伴的列表。
現(xiàn)在看一下 select() 函數(shù)。我們可以簡單地使用 BusinessPartner 類提供的靜態(tài)字段,而不是傳遞表示實體字段的字符串。因此,我們不僅消除了拼寫錯誤的風(fēng)險,而且還使其類型安全!同樣,這同樣適用于 filter() 和 orderBy()。例如,過濾男性業(yè)務(wù)伙伴變得像 .filter(BusinessPartner.IS_MALE.eq(true)) 一樣簡單——注意類型安全的比較。
這種方法的另一個好處是可發(fā)現(xiàn)性。由于所有內(nèi)容都表示為代碼,因此您可以簡單地使用 IDE 的自動完成功能來查看服務(wù)支持哪些功能以及實體包含哪些字段:首先查看包 com.sap.cloud.sdk 中提供的不同服務(wù).s4hana.datamodel.odata.services,實例化你需要的服務(wù)的默認(rèn)實現(xiàn)(類名以Default為前綴),然后查找服務(wù)類中代表不同可用操作的方法。基于此,您可以使用返回類型的字段來選擇要選擇的字段和要應(yīng)用的過濾器。
每個服務(wù)都由一個 Java 接口描述,例如 BusinessPartnerService。 SDK 為每個服務(wù)接口提供了一個默認(rèn)的、完整的實現(xiàn)。相應(yīng)的實現(xiàn)在名稱為前綴為 Default 的接口名稱的類中可用,例如 DefaultBusinessPartnerService。您可以簡單地實例化該類,也可以將依賴注入與相應(yīng)的 Java 框架結(jié)合使用。接口的好處是更好的測試和可擴展性支持。
總結(jié)
以上是生活随笔為你收集整理的使用 SAP Cloud SDK 连接 OData 服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抖音火山版观看历史记录怎么查看
- 下一篇: 在 SAP BTP 平台 Neo 环境里