先从一个真实场景说起。前阵子帮一个客户做S/4HANA升级后的Fiori应用收尾,明明所有角色都配好了,标准Fiori应用也能打开,可自家用CAP写的OData服务一到BTP上就各种404;还有一个项目,SAP Gateway独立部署之后,前端接口时不时返回403 CSRF token错误,每次重启网关就好了,大家开始怀疑是不是负载均衡把会话弄丢了。折腾一圈下来,问题的根源几乎都落在同一个判断上:SAP Fiori应用的数据通道到底该由谁来提供,服务要发布在哪一层,请求从浏览器到后台要穿过多少个网关节点。这几个问题没想清楚,后面从部署架构到日常Debug都会反复踩坑。
这篇内容围绕Fiori部署和OData数据提供策略展开,重点梳理SAP Gateway和SAP BTP两条主流路线,包括标准服务的激活、自定义服务的发布、沙盒启动调试、CSRF 403排查以及最终选型时的决策维度。内容更适合正在做Fiori架构规划、或者卡在OData接口实施中的顾问和开发人员阅读,你可以把它当作一份结合实战经验的选型笔记,而不是SAP官方文档的复述。
1. Fiori前端的背后:把OData服务当作“数据契约”来规划
1.1 为什么UI5不会直接连数据库,而是层层走OData
很多第一次接触Fiori的同事会下意识问:SAP Fiori界面到底是从哪张表拿数据的?实际上,标准Fiori应用几乎不会让前端直接访问数据库表。SAPUI5运行在浏览器里,它只认识OData协议,底层通过ODataModel向OData服务发请求,OData服务再通过ABAP层的RFC、BAPI、CDS视图或者SQL逻辑从后台取数。
这一层抽象不是多余设计,而是SAP在几十年的ERP界面演进中沉淀下来的边界:UI只关心数据契约,不关心数据物理位置。所以部署Fiori时,我们首先需要回答的不是“服务器装在哪”,而是“OData服务发布在哪、谁能访问、它背后连的是哪个数据源”。数据通道一旦划定,后续的权限、网络策略、性能诊断就都围绕着这条链路展开。
一个典型的标准Fiori应用请求路径是这样的:
浏览器 -> SAP Fiori Launchpad -> Gateway的OData运行时 -> 后端数据源(RAP行为实现/CDS视图/BAPI/RFC)
前端URL里经常看到的 /sap/opu/odata/sap/ 前缀,就是ABAP Gateway runtime的默认路径。只要这个OData服务未激活、或者对应的后端服务不可达,界面上就不会正常出现业务数据。
1.2 标准OData、自建OData与升级改造的边界
规划OData服务时,必须区分“标准服务”和“自定义服务”。
标准服务是SAP随应用交付的OData服务,比如采购申请、销售订单、我的审批等标准Fiori应用,后面对应的OData服务都由SAP提供,开发人员尽量不要去改它的底层实现。部署时只需要完成服务激活、角色分配和Launchpad配置。这类服务的最大价值在于升级兼容:只要不直接改标准代码,版本升级后大概率能平滑过渡。
自定义服务则是基于项目需求自行暴露的OData接口,通常用三种方式开发:
| 实现方式 | 适用场景 | 运行层 | 维护成本 |
|---|---|---|---|
| SEGW(Gateway Service Builder) | ABAP on-premise,基于RFC/BAPI/自定义表暴露OData V2 | SAP Gateway / 嵌入式网关 | 中,ABAP技能可维护 |
| RAP(ABAP RESTful Application Programming Model) | S/4HANA及S/4HANA Cloud上的新开发,OData V2/V4 | ABAP应用服务器 | 中低,和CDS深度绑定 |
| CAP(Cloud Application Programming Model) | BTP上的云原生扩展,主要OData V4 | SAP BTP Cloud Foundry | 低,常用 Node.js/Java |
这里要特别提醒:只要条件允许,就别通过修改标准OData服务实现个性化。前年我遇到一个项目,顾问为了在采购申请列表里多显示一个字段,直接在标准OData服务的模型里塞附加字段,结果升级S/4HANA 2022时模型冲突,Fiori界面整个打不开。后来改成通过扩展字段和自定义服务方式处理,才彻底解决。
1.3 数据提供策略要先于部署架构确定
常被忽视的一点是:部署架构讨论的是“服务跑在哪里”,数据提供策略讨论的是“服务怎么暴露数据”。两者必须联动。
如果打算在SAP Gateway上发布OData服务,而后端是独立ECC系统,那么需要明确RFC连接或HTTP连接、用户映射方式以及调用上下
