从头开始创建一个OData SAP Gateway Service

可能用到的事务代码:

/IWFND/IWF_ACTIVATE – Activate / Deactivate SAP Gateway
SEGW – SAP Gateway Service Builder
/IWFND/MAINT_SERVICE – Activate and Maintain Services
/IWFND/EXPLORER – Service Explorer
/IWFND/GW_CLIENT – SAP Gateway Client
/IWFND/STATS – SAP Gateway Statistics
/IWFND/TRACES – SAP Gateway Traces
/IWFND/VIEW_LOG – SAP Gateway Application Log Viewer
/IWFND/V4_ADMIN – SAP Gateway Service Administration
/IWFND/CACHE – Gateway Cache Management
/IWFND/CACHE_CLEANUP – Cleanup of GW Model Cache
/IWFND/CACHE_REBUILD – Rebuild Gateway Model Cache

SPRO中关于SAP Gateway的配置:

SAP Gateway的系统组件为SAP_GWFND:

创建SAP Odata服务的基本步骤大致为:

1.激活SAP Gateway服务(/IWFND/IWF_ACTIVATE – Activate / Deactivate SAP Gateway)
2.创建服务(SEGW – SAP Gateway Service Builder)
3.激活服务(/IWFND/MAINT_SERVICE – Activate and Maintain Services)
4.查看服务(/IWFND/EXPLORER – Service Explorer)
5.测试服务(/IWFND/GW_CLIENT – SAP Gateway Client)
6.查看日志(/IWFND/VIEW_LOG – SAP Gateway Application Log Viewer)

#激活SAP Gateway服务(/IWFND/IWF_ACTIVATE – Activate / Deactivate SAP Gateway)

Before you can use the SAP Gateway functionality, you have to activate it globally in your system.

If SAP Gateway is not activated, OData services cannot run, consumer servers cannot communicate with it, and an error message is sent to any system that calls the services.

SAP Gateway Foundation offers development and generation tools to create OData services to a variety of client development tools. Put simply, it establishes a connection between application or SAP Business Suite data and target clients, platforms, and programming framework.

可以简单将SAP Gateway Foundation (SAP_GWFND)理解为SAP ABAP服务器和外部系统进行数据交互的一个组件,一个类似WEB容器的平台。

关于SAP Gateway的更多信息可以在https://help.sap.com/viewer/product/SAP_NETWEAVER_750/7.5.9/en-US页面搜索关键字Gateway进去看,是一个成体系的知识。

#创建服务(SEGW – SAP Gateway Service Builder)

这一步就是基于SAP Gateway这个底层创建我们的数据服务(REST),例如销售订单服务、采购订单服务、员工信息服务、物料主数据服务、考勤时间服务、工单服务等,类似于创建webservice或者rfc函数。

只不过通过SEGW创建的是基于ODATA协议的数据服务,ODATA相比WS,更加现代、时尚和可操控,UI5与SAP后端系统进行数据交互所调用的数据服务大多也是基于ODATA协议的服务。

The OData service uses ABAP to retrieve SAP data and returns it via the OData service.

本例我们创建一个飞机航班查询的服务。

涉及到项目、数据模型、实体类型、实体集合、服务实施几个主要的概念。

项目,理解为一个文件夹,和SE80开发ABAP程序用到的“包”差不多一个概念,就是将ODATA服务进行分门别类管理的一个文件夹。

服务,就是对外提供odata数据接口的一个URI。

数据模型,SAP的表、RFC函数、BRF等都可以作为数据模型,通过数据模型这个工具可以将这些底层的东西通过简单的裁剪、配置、转换成服务需要的数据格式。例如,SAP的销售订单有多张表,但外部服务可能只需要某张表中的某几个字段,而且外部需要的字段名也和SAP DDIC不同,就可以通过数据模型进行转换。

实体类型,数据模型下的一个概念,一张表、一个RFC函数等都可以作为实体,一个实体就是一个实际提供数据的载体,有数据结构、字段。

实体集合,对实体类型进行了进一步包装,ODATA服务的CURD都是基于实体集合的。实体集合和实体类型是多对多的关系,例如我们可以创建好一个通用的销售订单实体,但对于不同的接口我们可以基于这个实体创建不同的实体集合,针对不同的实体集合有不同的权限管理、CURD逻辑。

服务实施,实体集合的CURD操作,暴露给外部的接口。

我们先创建一个项目,例如ZBC01,由于只是练习,因此使用$tmp包即可。

这样我们就有一个完整的ODATA项目目录结构了,接下来在这个标准结构中创建模型、写操作逻辑即可。

本例中我们将使用DDIC中的SCARR表作为数据源来创建一个数据模型,操作如下:

给实体取一个便于识别的明细,输入要作为实体数据源的表名,Next。

选择需要的字段,Next。

选择要作为主键的字段(建议一定要做),将对外暴露的字段名改成自己需要的(此处我只是将首字段全部改成小写,因为Linux服务器是区分大小写的,为了和其他系统交互更顺畅,我把他都改成小写了)。Finish。

这样基于这个数据源的数据模型就创建好了,自动创建了实体、实体集合以及实体集合对应的方法名(只是先生成了方法名,具体的数据处理逻辑后面要自己进去写)。

如果此时我们觉得这个实体有些地方还需要调整下,例如需要增加、减少、修改字段映射的,操作如下:

系统已经自动创建了一个这个实体对应的实体集合和实体集合对应的操作方法,如果你还需要基于这个实体创建其他的实体集合,新增即可。

例如我新增一个实体集合zairSet,系统会自动产生其对应的CURD方法。

可以看到,实体集合的方法是不能自己添加的,只能使用系统自动产生的这些个。那么对于同一个数据实体,不同的业务逻辑可能就需要创建不同的实体集合。

接下来激活运行时相关的一些信息,系统应该是在后台创建了一些程序、生成了一些DDIC相关的数据。

跟着向导走即可,可见系统将会创建一堆的类、注册两个服务,同时还会产生服务的版本号。这个动作和其他语言里用反射工具一键生成数据库表对应的操作代码是类似的。

#激活服务(/IWFND/MAINT_SERVICE – Activate and Maintain Services)

在SEGW中创建完服务之后,这个服务还没有部署到Gateway(类似于Nginx这样的容器)中,这一步的动作就是把开发好的服务注册(部署,发版……)到能被外部访问到的Gateway中。

进入这个事务代码之后可以看到已经有一个服务清单,只有这个服务清单里的服务才能被外部访问到,我们把上面开发好的Gateway Service注册到这里。

系统别名选择LOCAL或者自己配置的别名,服务名称可以输入星号进行匹配,或者输入上面生成的完整服务名,然后敲回车系统就会查出满足条件但还未注册的服务。

选中服务,添加即可。

此时返回到事务代码/IWFND/MAINT_SERVICE,就能看到我们刚刚注册的服务了,点击服务在下面的两个框中会显示这个服务的一些基本信息。

然后我们可以用浏览器或者SAP客户端测试这个服务。

测试结果反馈200,证明响应正常。

也可以用测试结果xml中的link,用浏览器进行访问,需要输入账号密码,效果是一样的。SAP客户端里的这个测试工具其实更高级,和Postman比较像,可以写header参数。

我们可以更改测试URL的后缀,传不同的参数,这样就能返回不同的结果。

例如,改成$metadata?sap-ds-debug=true就能返回这个实体集的基本属性、方法和其他运行时信息。

把后缀改成/zairSet?sap-ds-debug=true,执行GET方法就会调用SEGW里生成的GET方法获取数据,由于此时我们还没有编写获取数据的实际逻辑,只是产生了一个空方法名,执行这个动作会报错(http的返回码是501),解释得非常清楚。

请求:

响应:

那么我们就去SEGW写一下zairSet这个实体集合的GET方法的具体取数逻辑吧。

系统提示说这个方法还没实施,那我们就去实施。

向导自动打开了SE80,如果左侧的树状清单没打开自己打开一下。然后展开方法,找到要写逻辑的方法,右击选择Redefine即可进入方法写逻辑。

简单取几条数据测试下。

然后激活方法,可见有三个DDIC对象需要激活。

此时再测试这个服务就可以看到数据了。

点击右侧的Data Explorer可以以清单的形式看到每一条返回的数据,非常好用。

事务代码/IWFND/VIEW_LOG – SAP Gateway Application Log Viewer可以查看对应的LOG和报错信息。

这个例子参考下面的例子进行练习:

https://www.trailsap.com/dev/sap-webapps/?topic=segw-odata-gateway-service

这个实验只练习了GET方法,其他几个方法还需要进一步熟悉。

下一个实验将练习一下使用openui5访问这个服务,把前端和后端的操作都串一下。

https://openui5.org/

总结一下:

1.创建Gateway Service(SEGW – SAP Gateway Service Builder)
2.注册Gateway Service(/IWFND/MAINT_SERVICE – Activate and Maintain Services)
3.测试Gateway Service(/IWFND/GW_CLIENT – SAP Gateway Client)

隔天总结:
一个项目由数据模型(MDL,MPC),服务(SRV)和运行时(DPC)构成。

数据模型包括实体类型、关系和实体集合,数据模型下可包括多个实体类型,实体类型和实体集合可以是多对多的关系。

服务是基于数据集合的,每个数据集合有独立的CURD方法,SEGW生成运行时对象时自动创建(rebuild)服务CURD对应的类,具体的方法逻辑需自行去写(redefine)。
未redefine的方法在Inherited Methods 文件夹下,已经dedefine了的方法在Redefinitions下,redefine方法会需要激活三个DDIC对象。

服务生成之后需要注册到SAP Gateway中才能进行测试和外部访问,一个项目就是一个服务,只需要注册一次即可,后续有新的数据集合加入后只需要redefine对应的方法就能访问到。
服务管理工具(/IWFND/MAINT_SERVICE)是个非常强大的工具,可以添加、删除、测试、监控、统计服务。

通过服务管理工具(/IWFND/MAINT_SERVICE)可以跳转服务测试客户端(/IWFND/GW_CLIENT),这个客户端内置和多个非常方便的按钮,可以方便地切换实体集、添加请求后缀、导出测试结果,对于Odata的开发和测试比用Postman和浏览器要方便和强大太多。

发表评论