這是Jerry 2021年的第 25 篇文章,也是汪子熙公眾號總共第 296 篇原創文章。
最近有朋友給我留言,詢問關於 SAP Cloud Application Programming(簡稱CAP) 的相關開發流程。
早在 SAP 2019 TechEd 上,SAP CTO Juergen Mueller 向 SAP 生態圈傳遞了一條重要資訊:身處雲時代大環境下的 SAP 從業者,如何選擇最適合自己的 SAP 開發方式?
Juergen Mueller 給出了下圖所示的決策樹,幫助大家進行技術選型:
決策樹中展示的主要分支解釋如下:
- 如果待實現的需求,能夠透過非程式碼方式來完成,可以嘗試工作流(Workflow) 或者低程式碼解決方案(Low-Code),比如 SAP RAD by Mendix,細節可以參考 Jerry 這篇文章:SAP雲平臺上的Low Code Development(低程式碼開發)解決方案。
- 如果只能透過編碼實現需求,則可以選擇基於 ABAP 技術棧的 RAP(Restful ABAP Programming) 程式設計模型,或者非 ABAP 技術棧的 Cloud Application Programming 模型。
SAP Cloud Application Programming 模型的準確定義是什麼?
SAP 官網的定義是:SAP Cloud Application Programming 是一套由開發語言,開發工具和庫有機整合的框架,提供了一種高效,快捷,全棧式的企業級服務和應用開發手段。CAP 包含一套開發最佳實踐,讓開發者能夠專注於應用內具體業務邏輯的開發,而無需分心將精力花在重複的底層基礎設施功能的實現上去。
Jerry 在 2019 年 SAP TechEd 結束後,曾經寫過一篇文章,透過一個線上書店的例子,介紹了 SAP Cloud Application Programming 程式設計模型的使用方式:
使用Cloud Application Programming模型開發OData的一個實際例子
如果大家照著文章裡介紹的步驟,自己動手實踐一遍,不難發現,我們絕大部分工作量都花在了思考並設計線上書店裡涉及到的業務領域模型(Domain Model),比如書籍,書籍類別,作者,訂單及模型間的相互關聯關係。而這些模型本身的增刪改查和持久化邏輯等更底層的技術實現,全部由 SAP CAP 本身完成,無需應用開發人員操心。SAP CAP 期望透過這種設計,來提高企業級應用的開發效率和健壯性。
距離 Jerry 前一篇文章已經過去兩年了,最近我抽時間查詢了 SAP 官閘道器於 SAP CAP 開發流程的介紹,發現其在 2019 年的基礎上,從CAP 提供的開發工具的使用角度上說,沒有太大的變化,但不少細節之處進行了最佳化,使用起來感覺更加順暢。
本文介紹的使用 SAP Cloud Application Programming 模型開發線上書店的過程,分為下列四個步驟:
- 建立業務模型
- 將業務資料匯入資料庫表
- 開發 OData 服務,將業務資料暴露給消費者
- 開發前端 UI 頁面,透過 OData 服務,將步驟 2 準備的業務資料展示出來
本文使用到的原始碼,在 SAP 官網上能夠下載。
本文使用基於 nodejs 的 SAP Cloud Application Programming 完成線上書店應用的開發,因此需要安裝並配置 nodejs 開發環境。
- 建立業務模型
首先使用命令列,安裝 CAP 的 SDK 工具:
npm i -g @sap/cds-dk
完成之後敲 cds 命令,確保能看到下列輸出:
然後建立一個空的 CAP 專案:
cds init bookshop
cds init 命令列建立出來的專案,本質上還是一個 nodejs 應用,包含了 CAP 應用的骨架。我們接下來需要進入上圖示註了三個序號的資料夾裡,進行相應的業務邏輯開發。
- app 資料夾裡存放的是 CAP 應用的前端 UI 頁面,這些頁面消費該 CAP 應用提供的 OData 服務,將業務資料以 UI 方式展示出來。可以基於任何前端框架實現。
- db 資料夾裡存放的是 CAP 的業務模型定義,以及持久化資料庫相關的資源。
- srv 資料夾裡存放的是 OData 服務定義。這些 OData 服務負責將 db 裡定義的業務模型承載的業務資料暴露給消費者,比如被 app 資料夾裡開發的前端應用所消費。
用 Visual Studio Code 開啟新建好的 CAP 專案,首先在 db 資料夾的 schema.cds 檔案裡,建立線上書店業務模型。使用關鍵字 entity 定義一個名為 Books 的模型。
冒號後面的 managed,包含了幾乎所有業務模型都需要定義的 Administrative 資訊,即建立時間,建立者,修改時間,修改者。因此 SAP CAP 出於重用目的,將這四個欄位包裹在名為 managed 的 aspect 中。應用人員定義的業務模型,透過 : managed 的語法將其包含入內。
ABAP 開發人員可以將這種機制,類比成 ABAP DDIC 的 Include Structure.
採用同樣的語法,定義書籍作者(Authors) 和書籍類別(Genres)模型後,我們下一個需要考慮的問題就是,如何插入業務資料到這些模型對應的資料庫表裡。
- 將業務資料匯入資料庫表
SAP CAP 提供了一種比較簡單的資料匯入方式,即本地維護一些包含業務資料的 csv 檔案,將這些 csv 檔案匯入到模型對應的資料庫表裡。無獨有偶,SAP Commerce Cloud (電商雲)也支援這種 csv 檔案匯入的方式,實現資料匯入功能。這種資料匯入方式,在 SAP Commerce Cloud 裡稱為 ImpEx (Import & Export 的簡寫).
我在 db 資料夾下 schema.cds 裡定義的名稱空間為 sap.capire.bookshop, 因此為了使用 csv 檔案向這個名稱空間裡的資料庫表匯入資料,需要按照下列命名規範建立 csv 檔案:
<名稱空間>-<模型名稱>.csv
比如我匯入資料庫的作者資料,建立的 csv 檔名為:sap.capire.bookshop-Authors.csv
書籍資料:sap.capire.bookshop-Books.csv
書籍類別資料:sap.capire.bookshop-Genres.csv
csv 檔案維護完畢之後,執行 cds deploy 命令,將 csv 檔案匯入到資料庫裡。命令中 sqlite 冒號後面是我指定的資料庫名稱:my.db
cds deploy --to sqlite:my.db
資料匯入成功後,在Visual Studio Code SQLite Explorer裡能瀏覽資料庫表及其內容:
- 開發 OData 服務,將業務資料暴露給消費者
接下來,需要將上圖所示的 my.db 資料庫中的業務資料,透過 OData 服務,暴露給消費者。
SAP CAP 採用宣告式(Declarative)的服務定義方式,將業務資料透過 OData 暴露出來。
在 srv 資料夾下新建一個 cat-service.cds 檔案,實現一個圖書的目錄瀏覽服務(Catalog Service).
上圖 OData 服務原始碼一些關鍵點說明:
- 使用 using 關鍵字,匯入 db 資料夾下 schema.cds 檔案中定義的名稱空間 sap.capire.bookshop 下包含的業務模型。
- @path 註解,定義了該目錄服務的 endpoint 為 /browse.
- @readonly 註解,表明該 OData 服務只能以只讀的方式,暴露 Books 和 ListOfBooks 資料給消費者。
因為 Books 模型的定義裡,沒有直接包含書籍的作者名,而是透過一個名為 author 的 Association,指向對應的 Authors 模型。因此,上圖第五行,透過auth.name 後面的 as 關鍵字,將 Association 指向的作者模型的 name 欄位,內聯到 OData Books 模型中來。
執行 cds run 命令,啟動開發好的 CAP 應用:
http://localhost:4004 訪問,就可以測試我們透過以上三個步驟,開發完成的 OData 服務了。
這個由 cds SDK 自動生成的預設介面,提供了很多 OData 服務測試功能。
比如點選 Books 超連結,能透過下面 url 代表的 OData 服務呼叫,檢視到伺服器資料庫上所有的書籍資料:
http://localhost:4004/browse/...
點選 Fiori Preview 超連結,能夠在一個自動生成的 SAP Fiori Elements 應用裡,呼叫上述 url,將書籍資料展示在 Fiori UI 上。
Jerry 後續的文章,會根據該線上書店的例子,介紹更多 SAP Cloud Application Programming 開發相關的內容,敬請期待。
更多閱讀
- 使用SAP Cloud Application Programming模型開發OData的一個實際例子
- 30分鐘用Restful ABAP Programming模型開發一個支援增刪改查的Fiori應用
- Jerry帶您瞭解Restful ABAP Programming模型系列之二:Action和Validation的實現
- Jerry帶您瞭解Restful ABAP Programming模型系列之三:雲端ABAP應用除錯
- SAP雲平臺上的Low Code Development(低程式碼開發)解決方案
更多Jerry的原創文章,盡在:"汪子熙":