出於工做須要,Jerry寫了這篇文章,給某些Partner作參考。javascript
之前Jerry曾經介紹過SAP C/4HANA的五朵雲到底包含哪些具體產品,其實在SAP官網上有更權威的中文解釋:html
https://www.sap.com/china/pro...java
其中明確提到銷售雲包含SAP Cloud for Customer(C4C),SAP Revenue Cloud和Callidus Cloud。node
有Partner詢問有沒有更詳細的步驟介紹,關於如何在第三方系統裏調用SAP C4C暴露出的Restful API進行集成。本文就給出一個具體的例子,將SAP C4C銷售訂單的建立功能經過自定義的OData服務暴露出來,而後Partner能夠根據項目須要選擇合適的編程語言(本文選擇JavaScript)來消費。android
Jerry之前發佈過一個視頻,演示瞭如何在SAP C4C裏手動建立一個銷售訂單,步驟能夠說簡單易懂。git
https://v.qq.com/x/page/d0809...github
如今咱們經過OData的方式將銷售訂單的建立功能暴露出來,就能在第三方系統或者應用裏完成C4C的訂單建立。編程
你們若是對SAP OData還不太瞭解,能夠先讀一讀我這篇文章開頭的部分:瀏覽器
下面是詳細步驟。
登陸C4C系統,訪問工做中心Administrator,工做中心視圖OData Service Explorer,這裏能夠在SAP發佈的標準OData服務和客戶自定義的OData服務之間切換。
由於客戶自定義OData服務可以容許客戶自行決定從哪個Business Object的哪一些節點,選擇哪一些字段來生成OData模型,經過這種靈活的方式能夠避免Business Object上客戶業務場景裏不須要的字段出如今OData模型中。
點擊New按鈕新建一個OData服務:
給Work Center View字段指定一個用來作權限控制的視圖,只有分配了這個視圖的用戶纔有權限訪問這個OData服務。
點擊Select Business Object從彈出對話框中選擇基於哪個Business Object建立OData模型。
下圖就是一個已經建立好並處於Active狀態的OData服務。左邊顯示的是CustomerQuote這個BO的Root節點的全部字段,每一個字段都有一個能夠勾選或取消的Select屬性,勾選則該BO字段會出如今右側的OData模型裏。
除了Root節點以外,BO的其餘子節點上的字段固然也是能夠出如今OData模型裏的,好比我上圖右邊OData模型的子節點CustomerQuoteItem, CustomerQuoteParty和CustomerQuoteText等,就是分別從左邊BO的同名節點選中後自動帶到右邊的OData模型中去的。
理論上,完成基於BO模型進行OData模型的建立並激活後,這個OData服務就可使用了,這體現了SAP C4C OData服務自定義框架的強大之處。然而我也收到了一些朋友從後臺給我提的一些問題,羅列以下。
問題1: 仍然以本文銷售訂單建立這一場景爲例,假設我但願我建立的OData服務可以容許消費者調用時指定External Reference的值,可是我找遍整個BO列表,也沒發現銷售訂單的BO上有叫這個名稱的字段啊?
Jerry答:External Reference是UI文本,不是BO字段的技術名稱。
給C4C系統在瀏覽器裏的url添加參數debugMode=true, 而後刷新頁面,按住Ctrl鍵再單擊External Reference字段,
就能看到這個UI字段綁定到UI模型上哪個字段了。
在這個UI模型字段上再點擊Show Model,就能看到這個UI模型字段綁定到的BO字段名稱爲BuyerID。
因此咱們在OData開發工具裏,只需把BO字段BuyerID選中,移動到右邊的OData模型裏便可。
問題2:我想讓個人OData服務支持行項目數據的建立,好比指定產品ID,描述和購買數量等等。我怎麼知道哪些BO節點上的字段須要添加到OData模型中去?
Jerry答:如今咱們換一種方法,打開Cloud Application Studio的UI Designer,定位到銷售訂單建立頁面的UI模型COD_SALESORDER_QC, 找到Product ID字段,在它的Properties面板裏便可看到這個Product ID字段綁定的BO字段的名稱和完整路徑:
Root-.ItemProposal-~ProductUUID-~content
所以咱們須要將BO對應路徑下面的ProductUUID字段添加到OData模型中去。這裏能觀察到ProductID的Create和Update是沒有勾選上的,而ProductUUID則支持Create和Update,這個行爲和C4C銷售訂單行項目建立的標準實現有關——消費者須要提供待建立行項目包含的產品UUID,而後C4C會根據UUID到系統中查詢出對應的產品,顯示其ID到UI上。若是消費者在調用OData服務時,沒有指定ProductUUID,則行項目建立邏輯不會執行。
OData模型建立好以後,在用編程語言消費以前,咱們能夠先用工具Postman(或者C4C自帶的測試工具)進行測試。
由於SAP C4C後臺對Cross-site request forgery(跨站請求僞造)這種攻擊採起的防護實現和SAP CRM,SAP S/4HANA同樣,採起的是CSRF token驗證機制,所以咱們在調用OData服務進行銷售訂單建立時,須要將一個合法的CSRF token一併傳遞給C4C系統。
如何獲得一個合法的CSRF token呢?在Postman裏構造一個HTTP GET請求,頭部字段名爲
x-csrf-token, 值爲fetch:
發送這個HTTP GET請求,服務器端會生成一個CSRF token,經過HTTP響應結構頭部字段x-csrf-token返回給消費者:
sNwnYC9cV4xeGSYZmJ8Dtw==
下面咱們再在Postman裏新建一個HTTP Post請求,將以前經過HTTP GET拿到的CSRF token,以HTTP Post請求頭部字段的方式發送給C4C系統。
關鍵在於HTTP Post請求的請求體。下圖高亮部分是我在HTTP Post請求裏指定的建立銷售訂單的輸入數據:
在Postman裏發送這個Post請求,幾秒鐘後獲得C4C的響應,訂單建立成功,ID爲9000000451:
爲了方便你們對比,下面是我用Postman消費我建立的OData服務生成的銷售訂單在系統裏的顯示。字段1~6對應的Postman輸入字段能夠在前文找到。
藍色區域高亮顯示的字段,我在Postman裏構造的輸入裏並無維護,而是經過SAP C4C系統的各類determination配置,自動決定出來的。最典型的有SAP老司機們每天打交道的Partner determination,Organization determination,Pricing determination等。
Postman裏測試經過後,就能夠寫代碼消費了。
若是想直接複製粘貼我下面列出的代碼,能夠從個人github上得到:
https://github.com/i042416/Kn...
注意本代碼只用於演示目的,缺乏健壯的出錯處理,不能直接用於生產環境中。
下面的代碼使用nodejs提供的request模塊向C4C請求CSRF token。注意第3行的url和第11行的Authorization頭部的值,我都是用的虛假值,請你們替換成本身實際使用的C4C url和認證信息。
Token拿到以後,將其放入第41行構造的HTTP Post請求的頭部結構中,做爲字段x-csrf-token的值。第47行發送該POST請求,C4C響應的數據存放於JavaScript變量data中。
最後我經過簡單的console.log打印出建立成功的銷售訂單ID:
在命令行裏用node執行這個js文件,會打印出從C4C獲取到的CSRF token,以及成功建立的訂單ID。
咱們再回顧一下用SAP C/4HANA Sales Cloud中的C4C OData同外部系統作集成的三個主要步驟:
1. 在C4C的OData模型編輯頁面裏,根據業務須要,從對應的BO節點裏選擇合適的字段,添加到OData模型中。
2. 用Postman或者C4C自帶的OData測試工具對OData模型進行測試,確保其正常工做。
3. 根據項目須要選擇合適的編程語言消費OData服務。
若是對於SAP C4C OData有更多的問題須要討論,歡迎留言。感謝閱讀。
Jerry關於OData的更多文章
2. OData服務同步模式和異步模式的討論
https://blogs.sap.com/2015/06...
3. OData服務的性能分析
https://blogs.sap.com/2015/07...
https://blogs.sap.com/2016/01...
4. 基於SAP CDS view生成OData服務
https://blogs.sap.com/2016/03...
5. OData的offline支持
5.1 https://blogs.sap.com/2016/08...
5.2 https://blogs.sap.com/2016/08...
5.3 https://blogs.sap.com/2016/08...
6. 使用ABAP消費SAP C4C標準OData服務
https://blogs.sap.com/2017/08...
7. SAP CRM,C4C和S/4HANA裏OData服務實現的橫向比較
https://blogs.sap.com/2017/08...
8. 使用Java和jMeter對須要支持CSRF驗證的OData服務進行高併發性能測試
https://blogs.sap.com/2017/08...
9. 使用C4C OData + ABSL消費自定義BO的邏輯
https://blogs.sap.com/2017/12...
要獲取更多Jerry的原創文章,請關注公衆號"汪子熙":