十分钟玩转Fiori App中的ODATA Service

千金一刻莫空度,老大无成空自伤。这篇文章主要讲述十分钟玩转Fiori App中的ODATA Service相关的知识,希望能为你提供帮助。
我们谈了了很多关于OData的话题,但是Fiori APP到底是怎么通过SAP Gateway调用OData Service的呢?
今天我们通过一个Fiori App实例来分析一下。
首先我们启动Fiori App “Manage Journal Entries”,这个APP我已经引用了好几次,就不再介绍了。
输入简单的过滤参数,公司代码和财年信息。

十分钟玩转Fiori App中的ODATA Service

文章图片

点击执行,应用返回相应的财务凭证的Header信息列表。
十分钟玩转Fiori App中的ODATA Service

文章图片

SAP Fiori应用是怎么通过前端的SAP UI5来调用后端系统得到凭证的Header信息的呢?我们使用Chrome浏览器自带的工具:Developer Tools,(和IE的F12类似) 查看网络传输信息,主要关注:XHR数据传输,关于XHR(XML HTTP Request)大家可以自行百度。
信息如下图:
十分钟玩转Fiori App中的ODATA Service

文章图片

十分钟玩转Fiori App中的ODATA Service

文章图片

 
 
十分钟玩转Fiori App中的ODATA Service

文章图片
十分钟玩转Fiori App中的ODATA Service

文章图片

我们可以获取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))
十分钟玩转Fiori App中的ODATA Service

文章图片

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
 
十分钟玩转Fiori App中的ODATA Service

文章图片

 
好的,我们分析了浏览器传到前端服务器的URI信息,我们需要在前端服务器(Gateway Server)模拟OData Service调用。
这里要重点介绍 SAP Gateway Client,它是是非常重要的调试测试工具,我们会在未来详细介绍。
T-code:
/n/IWFND/GW_CLIENT
十分钟玩转Fiori App中的ODATA Service

文章图片

由于是本地调用所以省略: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
十分钟玩转Fiori App中的ODATA Service

文章图片

十分钟玩转Fiori App中的ODATA Service

文章图片

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
十分钟玩转Fiori App中的ODATA Service

文章图片

需要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中的ODATA Service

文章图片

我们看到了,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其他功能。
 
本文内容属于个人观点,不代表任何官方。
十分钟玩转Fiori App中的ODATA Service

文章图片

【十分钟玩转Fiori App中的ODATA Service】 

    推荐阅读