十分鍾玩轉Fiori App中的ODATA Service


我們談了了很多關於OData的話題,但是Fiori APP到底是怎么通過SAP Gateway調用OData Service的呢?

今天我們通過一個Fiori App實例來分析一下。

首先我們啟動Fiori App “Manage Journal Entries”,這個APP我已經引用了好幾次,就不再介紹了。

輸入簡單的過濾參數,公司代碼和財年信息。

點擊執行,應用返回相應的財務憑證的Header信息列表。

SAP Fiori應用是怎么通過前端的SAP UI5來調用后端系統得到憑證的Header信息的呢?我們使用Chrome瀏覽器自帶的工具:Developer Tools,(和IE的F12類似) 查看網絡傳輸信息,主要關注:XHR數據傳輸,關於XHR(XML HTTP Request)大家可以自行百度。

信息如下圖:

 

 

我們可以獲取OData調用的HTTP信息:

https://host:port/sap/opu/odata/sap/FAC_FINANCIAL_DOCUMENT_SRV_01/$batch?sap-client=210

協議:HTTPS

Hostname, port number,

Path of ICM node:/sap/opu/odata/sap

OData service name:

Payload:FAC_FINANCIAL_DOCUMENT_SRV_01

參數:$batch?sap-client=210,其中$batch表示是批處理,有多個Odata Service調用。

然后在payload信息里,可以看到有兩次OData Service調用:

GET Headers/$count?sap-client=210&$filter=((CompanyCode%20eq%20%270001%27)%20and%20(FiscalYear%20eq%20%272017%27))

GET Headers?sap-client=210&$skip=0&$top=116&$orderby=PostingDate%20desc&$filter=((CompanyCode%20eq%20%270001%27)%20and%20(FiscalYear%20eq%20%272017%27))&$select=AccountingDocument%2cAccountingDocumentHeaderText%2cCompanyCodeName%2cAccountingDocumentType%2cCreatedByUser%2cPostingDate%2cAmountInCoCodeCrcy%2cCompanyCode%2cAccountingDocumentTypeName%2cCreatedByUserName%2cAccountingDocumentCategoryName%2cLedgerGroupName%2cParkedByUserName%2cReversalReasonName%2cTransactionCurrency%2cCoCodeCurrency%2cFiscalYear%2cReferenceDocumentType%2cIntercompanyTransaction%2cReversalFunction%2cCopilotKey

大家可能覺得有點亂,很多特殊字符比如:%20, %27等等,這是轉義字符。

web 開發中通過問號(?)方式在瀏覽器地址欄中傳值時。瀏覽器是通過“&”來區分問號后的參數個數的。如果出現傳值參數中帶有特殊字符時,在接受頁面就會出現錯誤。

url出現了有+,空格,/,?,%,#,&,=等特殊符號的時候,可能在服務器端無法獲得正確的參數值,如何是好?

解決辦法

將這些字符轉化成服務器可以識別的字符,對應關系如下:

URL字符轉義

用其它字符替代吧,或用全角的。

+    URL 中+號表示空格                                 %2B   

空格 URL中的空格可以用+號或者編碼           %20 

/   分隔目錄和子目錄                                     %2F     

?    分隔實際的URL和參數                             %3F     

%    指定特殊字符                                          %25     

#    表示書簽                                                  %23     

&    URL 中指定的參數間的分隔符                  %26     

=    URL 中指定參數的值                                %3D

 

 

好的,我們分析了瀏覽器傳到前端服務器的URI信息,我們需要在前端服務器(Gateway Server)模擬OData Service調用。

這里要重點介紹 SAP Gateway Client,它是是非常重要的調試測試工具,我們會在未來詳細介紹。

T-code:

/n/IWFND/GW_CLIENT

由於是本地調用所以省略:https://hostname:port/

/sap/opu/odata/sap/FAC_FINANCIAL_DOCUMENT_SRV_01/$batch?sap-client=210

OData Service : FAC_FINANCIAL_DOCUMENT_SRV_01

Path: /sap/opu/odata/sap/

$batch批處理,會有不只一次調用。

Sap-client-210, 參數:client 210

在payload里查看ODATA Service請求的具體內容,為了便於理解,把轉移字符轉換成正常字符。

%2c -> , %20-> space %27->’

 

GET Headers/$count?sap-client=210&$filter=((CompanyCode eq '0001') and (FiscalYear eq '2017'))

分解URI, GET是HTTP Method, Headers是EntitySet,$count代表取結構集的行數量,$filter相當於選擇條件,就是SQL里的where條件一樣。

我們現在執行一下:

URI: /sap/opu/odata/sap/FAC_FINANCIAL_DOCUMENT_SRV_01/Headers/$count?sap-client=210&$filter=((CompanyCode eq '0001') and (FiscalYear eq '2017'))

HTTP Method : GET

GET Headers?sap-client=210&$skip=0&$top=116&$orderby=PostingDate desc&$filter=((CompanyCode eq '0001') and (FiscalYear eq '2017'))&$select=AccountingDocument,AccountingDocumentHeaderText,CompanyCodeName,AccountingDocumentType,CreatedByUser,PostingDate,AmountInCoCodeCrcy,CompanyCode,AccountingDocumentTypeName,CreatedByUserName,AccountingDocumentCategoryName,LedgerGroupName,ParkedByUserName,ReversalReasonName,TransactionCurrency,CoCodeCurrency,FiscalYear,ReferenceDocumentType,IntercompanyTransaction,ReversalFunction,CopilotKey

分析第二個URI,HTTP Method GET, Entity Set : Headers,&$orderby=PostingDate desc,查詢條件:&$filter=((CompanyCode eq '0001') and (FiscalYear eq '2017'))。

$select 返回的字段

為了簡單,我去掉一些字段。

/sap/opu/odata/sap/FAC_FINANCIAL_DOCUMENT_SRV_01/Headers?sap-client=210&$skip=0&$top=116&$orderby=PostingDate desc&$filter=((CompanyCode eq '0001') and (FiscalYear eq '2017'))&$select=AccountingDocument,AccountingDocumentHeaderText,CompanyCodeName,AccountingDocumentType

需要JSON格式的話,加上參數:$format=json

/sap/opu/odata/sap/FAC_FINANCIAL_DOCUMENT_SRV_01/Headers?sap-client=210&$format=json&$skip=0&$top=116&$orderby=PostingDate desc&$filter=((CompanyCode eq '0001') and (FiscalYear eq '2017'))&$select=AccountingDocument,AccountingDocumentHeaderText,CompanyCodeName,AccountingDocumentType

我們看到了,Fiori app通過UI5(Javascript類庫),調用REST類型的OData Service,XHR其實就是早年的Ajax技術,發給Gateway服務器URI請求,Gateway服務器返回XML or JSON格式數據。

我們如何分析Fiori app調用OData Service就是截取XHR通信信息,然后分析URI,在SAP Gate Client模擬URI調用。可以分析Error Message,也可以Debug OData Service的實現代碼。

好的,我們今天淺嘗輒止,在以后的文章中我們再深入探討如何Debug OData Service和SAP Gateway Client其他功能。

 

本文內容屬於個人觀點,不代表任何官方。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM