SAP雲平台上的ABAP編程環境里如何消費第三方服務

  • 2019 年 10 月 7 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://jerry.blog.csdn.net/article/details/101275404

在ABAP On-Premises環境下,使用ABAP編程消費第三方服務,相信很多ABAP顧問都已經非常熟悉了,無非就是使用CL_HTTP_CLIENT或者CL_REST_HTTP_CLIENT來發送和接收HTTP請求。

下圖這短短的38行程式碼,展示了如何使用ABAP工具類CL_HTTP_CLIENT去訪問百度首頁並拿到回復。

從百度返回的響應,通過方法GET_CDATA獲得,存儲於變數rv_data內:

當然如果我們是做正式的產品開發的話,一般不會把第三方服務的URL硬編碼在應用程式里,而是通過事務碼SM59創建的Destination管理第三方服務的endpoint,然後把Destination名稱存儲於配置表裡,這樣使得第三方服務的URL同應用程式碼解除耦合關係。

下圖是一個例子,我在SM59事務碼里維護了一個指向某C4C系統的Destination,取名為C4C:

然後在ABAP程式碼里使用cl_http_client=>create_by_destination創建HTTP工具類的實例。後續操作同使用cl_http_client=>create_by_url構造實例的程式碼一致,這裡不再重複。

如果我們直接把On-Premises環境下的這些ABAP程式碼搬到SAP Cloud Platform的ABAP環境里,會遇到很多語法錯誤:

原因在Jerry的第一篇介紹SAP雲平台ABAP編程環境的文章 在SAP雲平台ABAP編程環境上編寫第一段ABAP程式 里就已經提到,雲端的ABAP編程模型支援的只是ABAP程式語言的一個子集,我們只能使用SAP開放的白名單里的資源,這個白名單即上圖左邊Released Objects裡面包含的內容。

因為Jerry在On-Premises環境里使用過的CL_HTTP_CLIENT, CL_REST_HTTP_CLIENT, IF_HTTP_CLIENT等ABAP類和介面均不在白名單內,故無法在ABAP雲端環境使用。

既然在雲端了,我們就得使用雲端的編程範式。

Jerry去年的文章使用Java+SAP雲平台+SAP Cloud Connector調用ABAP On-Premise系統里的函數 里曾經介紹過運行在雲端的Java應用如何通過SAP雲平台上創建的Destination來調用ABAP On-Premises系統里的RFC函數。如今我們在雲上運行的應用的程式語言從Java換成了ABAP,然而藉助Destination進行第三方服務調用的思路仍然不變。

Jerry先把正確答案公布出來,在SAP Cloud Platform ABAP編程環境訪問第三方服務的程式碼如下:

可以看到其思路就是通過CL_HTTP_DESTINATION_PROVIDER這個雲端的Destination工廠類,拿到Destination實例,然後基於該實例創建雲端上的ABAP HTTP客戶端實例。工廠類生產Destination實例需要兩個參數:

  • i_name
  • i_service_instance_name

根據這個方法的介面注釋,這兩個參數分別為Destination的名稱和Service instance的名稱。下面Jerry介紹如何獲得這兩個參數的值。

在SAP Cloud Platform Service Marketplace里創建一個新的Destination實例:

我們把新建的實例取名為DestService,然後再基於該實例創建一個Destination配置,這個配置就好比我們在ABAP On-Premises的SM59事務碼里創建的Destination:

Destination我取名為ZJERRY_API, 這就是前面提到的工廠方法里第一個參數i_name值的由來。

點擊Check Connection,確保該Destination指向的URL可以訪問:

然後點擊Open Dashboard,打開這個SAP Cloud Platform ABAP實例的Fiori介面:

點擊Launchpad tile,創建一個新的Communication Arrangements:

需要為新建的Communication Arrangement選擇一個Communication Scenario,這裡我選擇SAP標準發布的專門用於CloudFoundry環境同第三方服務進行集成的場景,ID為SAP_COM_0276:

創建Communication Arrangement時還要維護Service Key資訊:

這個Service Key的資訊可以從Destination實例列表的Service Key維護介面獲得:

在創建好的Communication Arrangement里,維護Service Instance Name的值為jerry-service-instance, 這也就是ABAP程式碼里傳給工廠方法的第二個參數。

執行這個ABAP類:

獲得期望的輸出:

感謝閱讀。