十分钟玩转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其他功能。

本文内容属于个人观点,不代表任何官方。

时间: 2024-07-31 22:08:49

十分钟玩转Fiori App中的ODATA Service的相关文章

十分钟玩转 jQuery、实例大全(参考自博主索宁)

十分钟玩转 jQuery.实例大全(参考自博主索宁) 一.简介 书写规则 支持链式操作: 在变量前加"$"符号(var $variable = jQuery 对象): 注:此规定并不是强制要求. 二.寻找元素 选择器 基本选择器.层级选择器.属性选择器  与CSS类似,这里不再细说,详细猛戳这里. 基本筛选器 $('li:first') //第一个元素 $('li:last') //最后一个元素 $("tr:even") //索引为偶数的元素,从 0 开始 $(&q

十分钟玩转 SAP Gateway Client

在上一篇我们使用了SAP Gateway Client来测试OData Service,但是感觉还有好多功能没有提到,今天我们用十分钟,看看SAP Gateway Client还能给我们哪些惊喜. T-code:/n/IWFND/GW_CLIENT 在最上边的一排按钮,都是很重要的功能键.比如:Service Administration 跳转到 Gateway管理事务码:/n/IWFND/MAINT_SERVICE上. Service Implementation就可以直接跳到 Service

十分钟玩转 jQuery、实例大全

一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库.源码戳这 jQuery对象 jQuery产生的对象时jQuery独有的,只能自己调用 书写规则 支持链式操作: 在变量前加"$"符号(var $variable = jQuery 对象): 注:此规定并不是强制要求. 二.寻找元素 选择器 基本选择器.层级选择器.属性选择器  与CSS类似,这里不再细说,详细猛戳这里. 基本筛选器

十分钟理解Java中的动态代理

十分钟帮助大家理解Java中的动态代理,什么是动态代理?感兴趣的小伙伴们可以参考一下 若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. 一.概述1. 什么是代理我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家"委托"代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道背后的厂家究竟是谁,也就是说,"委托

准备 overlay 网络实验环境 - 每天5分钟玩转 Docker 容器技术(49)

为支持容器跨主机通信,Docker 提供了 overlay driver,使用户可以创建基于 VxLAN 的 overlay 网络.VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 VLAN 相同的以太网二层服务,但是拥有更强的扩展性和灵活性.有关 VxLAN 更详细的内容可参考 CloudMan 在<每天5分钟玩转 OpenStack>中的相关章节. Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network.Endp

十分钟搭建App主流框架_纯代码搭建(OC),你不知道的框架

十分钟搭建App主流框架_纯代码搭建(OC),你不知道的框架java学习爱好者 2019-06-11 14:28搭建主流框架界面 需要源码的可以私信我达成效果 效果图ps :需要源码的可以加群,668041364导读 我们玩iPhone应用的时候,有没发现大部分的应用都是上图差不多的结构,下面的TabBar控制器可以切换子控制器,上面又有Navigation导航条我们本文主要是讨论主体框架的搭建,数据暂时没有添加分析做项目的基本流程 1.搭建项目主框架(1)先搭建tabBarController

在 Rolling Update 中使用 Health Check - 每天5分钟玩转 Docker

上一节讨论了 Health Check 在 Scale Up 中的应用,Health Check 另一个重要的应用场景是 Rolling Update.试想一下下面的情况: 现有一个正常运行的多副本应用,接下来对应用进行更新(比如使用更高版本的 image),Kubernetes 会启动新副本,然后发生了如下事件: 正常情况下新副本需要 10 秒钟完成准备工作,在此之前无法响应业务请求. 但由于人为配置错误,副本始终无法完成准备工作(比如无法连接后端数据库). 先别继续往下看,现在请花一分钟思考

在 Scale Up 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(

对于多副本应用,当执行 Scale Up 操作时,新副本会作为 backend 被添加到 Service 的负责均衡中,与已有副本一起处理客户的请求.考虑到应用启动通常都需要一个准备阶段,比如加载缓存数据,连接数据库等,从容器启动到正真能够提供服务是需要一段时间的.我们可以通过 Readiness 探测判断容器是否就绪,避免将请求发送到还没有 ready 的 backend. 下面是示例应用的配置文件. 重点关注 readinessProbe 部分.这里我们使用了不同于 exec 的另一种探测方

花十分钟,让你变成AI产品经理

花十分钟,让你变成AI产品经理 https://www.jianshu.com/p/eba6a1ca98a4 先说一下你阅读本文可以得到什么.你能得到AI的理论知识框架:你能学习到如何成为一个AI产品经理并且了解到AI产品经理如何在工作中发挥作用,以及AI产品经理需要从哪些方面锻炼能力.最重要的是,通过本文,一切都特别快(手打滑稽). PS:目前只针对弱人工智能(我喜欢简称,此处我们简称为"弱智")进行学习. 首先我们必须要掌握的是AI的专业知识框架,然后了解AI的市场情况,最后要明白