之前写了一篇使用RFC形式的配置PO接口的笔记,那一篇的配置比较简单,且在安全性方面不太可靠。所以这次介绍一下比较常用也相对灵活的代理类形式的配置方式。
代理类形式的PO接口配置
一、需求分析
1.读取航班表SFLIGHT表中的数据信息
外围系统需要通过航线代码CARRID、航班连接编号CONNID和航班日期FLDATE三个字段读取航班表中的信息。其中他们所对应的接口字段名称与外围系统所需要使用的字段结构如下所示:
SAP对应的字段 | 类型 | 外围系统所对应的字段名 |
---|---|---|
CARRID | STRING | RouteCode |
CONNID | STRING | FlightConnection |
FLDATE | STRING | FlightDate |
PRICE | DEC(15,2) | AirFreight |
CURRENCY | STRING | LocalCurrency |
PLANETYPE | STRING | AircraftType |
SEATSMAX | STRING | MaximumCapacity |
SEATSOCC | STRING | EconomyClassSeatsUsed |
PAYMENTSUM | DEC(17,2) | TotalNumberOfReservations |
SEATSMAX_B | STRING | MaximumCapacityOfBusinessClass |
SEATSOCC_B | STRING | BusinessClassSeatsUsed |
SEATSMAX_F | STRING | MaximumCapacityOfFirst |
SEATSOCC_F | STRING | FirstClassSeatsOccupied |
根据上图的字段对应关系可以看出,外围系统的接口字段与SAP的接口字段并不一致,所以我们需要新建两套Data Type对象用于映射SAP系统字段与外围系统的字段。并且是根据三个主键进行的查询,所以约定成用于筛选的输入结构如下所示:
1 | { |
二、新建PO接口 Enterprise Services Builder
1.新建接口文件夹
在命名空间或文件夹上右键,新建一个如下图所示的文件夹。


在新建好的界面上点击保存按钮,就可以在左侧的工具栏处看到新建的文件夹了。

2.新建输入参数的Data Type
(1)新建Data Type对象
填入用于区分的Data Type对象名称与描述,然后点击左下角的创建按钮新建一个Data Type对象。在这个地方可以根据自己的需求来,可以只创建一个Data Type对象然后SAP端的输入参数名称和这个名称保持一致即可。也可以专门再新建一个SAP端用的Data Type。然后一会通过Message Mapping进行映射即可。
为了方便理解,本篇笔记会新建两套Data Type用于讲解PO中数据方向对参数配置的影响。所以在这个地方我们新建两个用于输入参数的Data Type。



(2)填写Data Type输入参数结构
由输入参数的JSON结构可以看出来,三个输入的字段结构都是数组形式的。所以在配置的时候我们需要将其放在一个结构中封装起来。然后在配置通道的时候设置数据类型为数组即可。
想要封装成一个结构,则需要在字段的Occurrence列设置字段属性的maxOccurs为unbounded。这样就代表该字段是一个结构,然后就可以插入子元素。用ABAP来说的话,被设置为unbounded的字段为结构体名称,然后插入该字段的子元素就是该结构体下的字段名。
① 配置SAP端的输入参数字段结构

完整的输入参数结构如下,其余两个字段的配置方式都是一样的。

② 配置外围系统端输入参数

完成的外围系统输入参数结构。

(3)填写Data Type输出参数结构
根据SAP传出的结构参数与外围系统的接口字段参数关联起来。这些的配置方式都是和上面的内容一致的,所以此处就只展示最终配置好的参数结构就行。
同样的要先和上面新建Data Type一样,需要现新建两个Data Type对象。

① 配置SAP端的输出参数字段结构

② 配置外围系统端的输出参数字段结构

3.创建Message Type
创建Message Type对象。这个对象就是用在接口数据传输过程中的对象,可以理解为信息的载体。用ABAP的开发来理解的话,Data Type是定义了一种数据类型,而Message Type对象则是参照数据类型定义的变量,要存储数据和内容自然是要使用变量也就是Message Type去存储。
此外有个不算规范的小技巧,在创建Message Type对象时我们可以将Message Type的后缀名称写成与Data Type一致的后缀名称,这样就可以很快的定位到Message Type所参照的类型。

新建完成Message Type对象后,我们就需要为该对象声明参照类型,也就是Data Type对象。当你的PO中有很多的Data Type对象,直接通过Data Type的名称引入时数据太多不利于查找。所以也可以考虑先填入Data Type所在的命名空间(Namespace)缩小查找范围。

新建完成之后点击最上方的保存按钮,就可以在最左侧的工具栏中看到新建的对象了。下图中工具栏中圈出来的Message Type对象就是SAP端与外围系统端所对应的全部Message Type对象。

(1)创建输入参数结构的Message Type
① 外围系统端输入参数结构

② SAP端输入参数结构

(2)创建输出参数结构的Message Type
① 外围系统端输出参数结构

② SAP端输出参数结构

4.创建字段映射对象Message Mapping
来到了PO创建的一个小重点。Message Mapping对象是用来关联SAP端接口字段与外围系统端接口字段的。简单来说就是告诉PO中间件,我需要将这个结构的A字段的值传递到另一个接口的a字段中。这就是Message Mapping对象所作的事情。
介绍完Message Mapping的作用后接下来介绍如何创建和配置Message Mapping对象。先介绍创建对象。
(1)创建Message Mapping对象

点击左下角的创建按钮,进入下面的界面中。在该界面中左侧的空白区域需要填入数据来源Message对象,在右侧需要填入数据目标Message对象。

(2)Message Mapping映射方向
Message Mapping的映射方向顺序不能反,不然后续在使用过程中会报错。简单来说就是根据接口的调用方向来判断数据的来源与去向。
如果是SAP推送数据到外围系统,那么在Request中映射的关系就是SAP是输入源,那么在左侧就需要填入SAP端的Message Type。而传输出去之后获取外围系统接口返回值的Response中映射关系是外围系统是输入源,在Response映射结构中左侧的输入源就应该是外围系统端的Message Type。

反过来如果是外围系统推送数据到SAP系统,那么在Request的映射结构中,外围系统段就是输入源,在左侧的映射关系中应该填入外围系统端的Message Type。反过来,在外围系统推送数据到SAP后,SAP需要返回信息给外围系统,这个时候在Response中SAP端就是输入源。

(3)配置Request Message Mapping
本次的接口是外围系统调用SAP的接口(需要推送数据到SAP端)。所以按照上面的数据传导方向,在Request结构中外围系统是数据源,SAP端是目标数据。所以左侧引入外围系统的Message Type对象 MT_DEMO001_DEMO2ERP_REQ_OUT,右侧引入SAP端的Message Type对象MT_DEMO001_DEMO2ERP_REQ。

(4)映射Request Message Mapping字段
进行完上面的操作之后会发现每个字段和结构前面有一个圆形的灯。此时是灰色的,代表没有与之映射的字段。选中左右两边的结构,点击映射按钮映射两个字段或结构。当两个结构下有同名的字段时,会自动映射字段名相同的字段。

当字段全部映射结束后,会发现有映射关系的字段前面的圆形灯会变成绿色。代表字段映射成功。
(5)配置Response Message Mapping
与上面配置Request的映射关系一样,需要先分清楚数据的方向。本次的接口是外围系统调用SAP端的接口,所以在一开始传入数据时是外围系统端传入的,而此时响应外围系统的请求后需要回传SAP端的消息给外围系统。所以在Response的映射结构中数据源是SAP端,目标数据是外围系统端。
即左侧的Source Message是MT_DEMO001_DEMO2ERP_RES,右侧的Target Message是MT_DEMO001_DEMO2ERP_RES_OUT。

(6)映射Response Message Mapping
和上面的操作类似,根据FS给出的字段对应关系一个字段一个字段的映射即可。最终映射完成之后见下图。

5.配置Service Interface
(1)创建Service Interface对象
上面创建了很多的对象,例如SAP端的Message Type对象MT_DEMO001_DEMO2ERP_REQ与MT_DEMO001_DEMO2ERP_RES。外围系统端的Message Type对象MT_DEMO001_DEMO2ERP_REQ_OUT与MT_DEMO001_DEMO2ERP_RES_OUT。我们可以根据命名规则知道他们两两一组是对应的Request与Response对象。
此时我们需要告诉系统,上方的Message Type对象哪两个是一组的对象。也就是将同一个数据端的Request对象与Response对象关联起来。这样在数据进入中间件时就会根据对应的接口来传递数据。简单来说就是PO系统哪两个Message Type是SAP端的,哪两个Message Type的外围系统端的。
在Service Interface中,除了可以关联Message Type对象,还可以设置接口对应的Request与Response对应的是那个对象。


(2)创建SAP端的Service Interface对象
创建完Service Interface对象后,还需要配置方向。也就是Category属性,在图中用红框圈起来了。此处需要设置当前Service Interface是inbound还是outbound。此时可以遵循调用方是outbound,响应方是inbound。
在这个接口中,外围系统是调用方,SAP是响应方。所以在SAP端的Service Interface对象应该将Category属性设置为inbound。

(3)创建外围系统端的Service Interface对象
同理,创建外围系统的Service Interface对象时,因为他是调用方,所以设置Category属性设置为outbound。

6.配置Operation Mapping
(1)创建Operation Mapping对象
此处设置的内容和上面的Message Mapping对象设置的内容类似,也是需要区分数据源和目标数据。简单理解成接口的调用方是数据源,而响应方是目标源即可。我们刚刚在上面设置了两个端的Service Interface对象。
接下来是新建Operation Mapping对象的操作。

(2)配置Operation Mapping对象
按照上面说的内容,接口的调用方是数据源,而响应方是目标源。在外围系统调用SAP端接口时,外围系统是调用方(数据源),SAP端是响应方(目标源)。对Operation Mapping对象进行设置。

配置完数据源与目标数据后,点击下方的刷新按钮唤出下面消息的映射关系页签Request与Response。
因为我们在上面配置了数据源与目标数据的关系,所以下面会根据上面配置的Message Type自动带出来对应的对象,然后在中间填写他们两者之间的Mapping关系即可。

Response页签的Message Type映射关系。

7.激活全部对象
配置完上面的所有对象之后,就可以激活创建的所有对象了。当然在创建中途你也可以激活未处于活动状态的对象。这里只是为了统一介绍功能所以才放在了一起介绍。在每个新建的对象未激活前,所创建的对象在左上角都会带一个红色的小勾。激活对象是没有这个图标的。例如在下面的第一张图中,下面的MM文件夹和SD文件夹都是激活状态,而其他的对象左上角都带有红色的小勾图标,代表未激活对象。
在未激活的对象上单击右键,点击Activate按钮。之后会弹出一个未激活对象的列表弹框。在其中勾选你要激活的对象,然后再点击弹框左下角的Activate按钮,激活选中的对象。


激活完成后,如果没有报错就会弹出下面的弹框。点击弹框的close按钮后,就可以看到刚刚未激活的对象左上角小勾图标消失了。


三、集成生成器 Integration Builder
1.业务组件/业务系统 Business Component/System
这两种对象简单来说就是业务系统(Business System)是具有真实地址的对象,而业务组件(Business Component)是虚拟的服务对象。在使用时是需要通过Communication Channel对象设置各项属性和访问用的URL地址的。但是业务系统在一开始配置PO时就配置好响应的属性了,所以在集成生成器中只需要Assign进来就可以了。在创建接口时因为会根据配置自动带出属性等信息,所以不需要像虚拟对象一样配置很多的属性了。
(1)配置业务系统 Business System
在这里简单介绍一下配置业务系统(Business System)的地方和方法。在一开始配置好PO时,就可以在System Landscape Directory中设置业务系统了。
但是因为本片笔记主旨在于介绍配置代理类形式的PO接口,所以这里只简单介绍一下如何配置。
配置业务系统的地方如下图所示。点击下图红框选中的超链接进入System Landscape Directory界面。

在该界面需要先配置好技术系统,然后再去下面的业务系统中配置业务系统(Business System)对象。因为下面业务系统中的对象属性基本都是从上面导入的技术系统中映射过来的,所以需要先配置好上面的技术系统,然后再去配置业务系统。

在技术系统界面会看到目前已经配置好了四套系统,分别是PO的开发系统和测试系统以及SAP的开发D系统和测试Q系统。

在配置完成上面的技术系统之后就可以去刚刚看到的业务系统中根据导入的系统配置业务对象了。配置好的业务对象如下图所示。

新建业务对象的步骤如下图红框圈中的内容所示。

(2)配置业务组件 Business Component
这个对象是虚拟对象,没有地址等属性信息,所以在使用时一般需要配置Communication Channel对象设置各项属性和访问用的URL地址。所以创建的时候比较简单,只需要在一个对象上单击右键New,选择Business Component即可。

2.配置 接口通信通道 Communication Channel对象
这个可以简单理解为为业务组件或业务系统配置属性的对象,一个业务组件/系统可以拥有多个不同的通信通道对象。而每一个通信通道对象都对应一个/多个接口,所以才可以做到一个业务组件/系统可以同时对接不同类型与不同地址的接口。
(1)新建对象
在新建通信信道时需要在界面上填写通信组件(Communication Component)。这个一般填写都是虚拟的对象,也就是业务组件对象。我们本次使用自己配置的BC_DEMO_CYH对象。

(2)配置通信通道基础属性
本页面重要的信息很多,第一个就是需要在最开始的位置设置适配器。也就是图中第一个红框圈起来的地方。在设置完这个地方之后才会出现下面的多个页签。
第二个需要注意是判断当前通信通道到底是发送方还是接收方。这个的判断是通过刚开始在创建通信通道时输入的业务组件对象,相对于他来说是发送方还是接收方。我们在创建时,导入的业务组件对象是外围系统方。他们是调用我们的接口,所以他们是请求的发送方。
第三个需要注意的是需要设置下方的Element Name和Element Namespace。这个地方需要传入的是Message Mapping对象Test页签中的东西。详细位置可以参考下一张图片。
第四个就是最下面的设置数据格式的地方,这里可以设置传入和传出JSON报文中的字段数据格式。例如传入的是数组(内表)或传出的是数组(内表)等信息,也可以在这里对某一字段设置默认初始值。本次配置的接口中数组形式的字段很多,所以配置了较多的内容。

Message Mapping对象Test页签。

(3)配置通信通道的接口地址后缀
此处还可以灵活的设置动态参数从SAP端或外围系统端灵活的传入PO进行处理,这个后面有机会单独介绍。多适用于一个PO的通信访问多个其他接口。简单来说比如一个SAP端的接口需要将数据推送给不同外围系统的接口地址,就需要在这里动态的配置外围系统的接口地址。
本次接口不涉及这些内容所以只需要将SAP端接口后缀设置好之后就可以设置下一项请求方式的配置了。

(4)配置通信通道的请求方式
因为是请求数据的接口,所以我们将他的请求方式设置未GET请求方式即可。

配置完上面的所有过程之后,通信通道对象的属性就全部设置完成了,这个时候激活就可以了。
3.配置代理类的通信通道
这一步主要是对没有启用或尚未配置代理类访问服务用的。如果你的PO已经配置过SAP端的XI服务访问方式可以直接跳过这一步,到下面的集成配置。
(1)新建通信通道对象
因为是400系统的XI通信通道对象,即配置的是400系统的服务。所以这里的业务组件是BS_DEV_400。

(2)选择通信通道适配器
代理类的适配器是SOAP,但是需要变更Message Protocol(消息协议)为XI 3.0。完成之后选择通过URL地址方式配置服务地址。在最下面选择登录SAP的方式。目标URL地址获取方式在下一步介绍。

(3)获取目标URL Target URL
这个目标URL是通过事务码 SICF进入SAP Service界面,点击运行按钮进入到Service列表中。

在列表中展开SAP页签,展开XI页签,最后在集成引擎(SAP XI消息格式)上单击右键选择测试服务。此时会有一个弹框也可能不会有,但是最后都会跳转到浏览器。此时浏览器的URL就是目标URL。

网页的目标地址。

4.配置 集成配置 integrated configuration 对象
(1)配置业务组件的接口服务
在新建集成配置对象前,需要先去参与交互的业务组件对象处将本次它参与的接口服务对象填充进去。本次我们使用的是BC_DEMO_CYH业务组件对象且他是发送方,所以我们需要在他的发送页签中将对应接口的Service Interface填充进去。

(2)新建集成配置对象
在创建集成配置对象时,一样需要传入业务组件对象。这里传入的业务组件对象是固定的,是接口的调用方。如果调用方是SAP,则在这里传入SAP端的业务系统。如果调用方是外围系统则在这里传入外围系统的业务组件对象。
第二个interface输入框中则需要填入我们配置的接口所对应的Service Interface对象,这个对象需要在上面的操作中引入业务组件对象才可以在这里使用搜索帮助带出来。

(3)配置通信通道对象
因为在开头配置过发送方的业务组件对象了,所以在这里只需要配置发送方的通信通道即可。在通信信道中有发送方的属性信息。

(4)配置接收方
配置完发送方的属性信息之后就需要配置接收方对象了。在这里可以配置多个对象,既可以在这里配置400的接收方也可以配置500的接收方等。不过需要设置一下响应的条件,即告诉系统在什么情况下调用哪个系统的数据。这个判断条件是在第二列的Condition中进行设置的。

下面附带一张多系统响应的参考截图。

(5)配置接收方报文映射关系
这里主要设置的是接收方对字段的映射关系。不同的接收方系统可以调用不同的映射关系。

(6)接收方输出设置
此处的配置是根据接收方配置的属性去设置的,一般只要选好接收方,这个地方会自动带出来接收方的CC配置。我这里配置了两个访问方式,第一个是通过XI的代理类方式访问的通信通道,第二个是通过SAP 的RFC方式访问的通信通道。我们选择上面配置的代理类方式的通信通道。

(7)高级设置
这里主要是配置一些日志相关的内容。配置完这些内容之后就可以激活创建的对象了。到这一步,PO端的配置就全部完成了。剩下的就是到SAP端激活和生成代理类,然后在其中编写接口的响应逻辑了。

四、SAP端接口响应逻辑
1.激活PO生成代理类对象
(1)查找对应的PO对象路径
使用事务码 SPROXY进入SAP端PO配置界面。

(2)Generate对象
在其中一个对象上右键点击Generate选项生成对象,此时会弹框需要你绑定生成的对象应该存放在什么包和事务码下。


(3)激活生成的对象
生成完成的对象前面图标和原来生成之前的一样,只有在生成之后激活对象后,该对象才算是在SAP中可以使用的对象。对象前的蜕变也会变成一个右下角带绿色方框的图标。

在生成对象时可以直接根据自己的接口需求进行生成即可。在图中可以看到一个PO对象有两个Service。一个是消费者,一个是供应商。这两个带入到调用方与响应方中就是接口调用方是消费者,接口响应方是供应商。在本次配置的接口中,因为是外围系统调用SAP端的接口。所以SAP端是供应商,外围系统端是消费者。
这样一来我们就只需要生成一下供应商服务,编写他的响应逻辑即可。操作的方式和上面的一致,先生成Service Providers,然后在激活生成的代理类型对象即可。


(4)查看代理类实例化方法
在生成的服务上,双击实现类对象,查看接口响应的实例化方法。

(5)接口响应逻辑
因为是查询航班表的逻辑,所以这里根据传入的筛选条件编写查询逻辑并将返回的数据封装到对应的参数结构中即可。
1 | METHOD ZII_SI_DEMO001_DEMO2ERP_SYNC_S~SI_DEMO001_DEMO2ERP_SYNC_SAP. |
五、测试接口
1.Postman测试接口
打开Postman输入接口地址,然后在权限处选择Basic类型的权限,然后此处填入的是PO的登录账号。

2.传输筛选JSON
编写筛选的JSON字符串,发送到接口查看取数是否正确。接口联通成功。

六、其他内容
1.配置PO目标
上面在配置PO时介绍了配置SAP端的代理类通信通道。那是其中一种配置的方式,如果只有个别接口需要使用代理类方式的话,可以使用那种方式配置。但是如果存在多个系统需要不断切换数据源时,或有特殊的需求比如需要PO端登录SAP的账号不同时,就比较麻烦了。所以这里再介绍一种通过目标来设置访问服务器的方式。
(1)目标链接位置

(2)目标页签位置

(3)创建目标对象
点击上面的创建按钮,在下面先填写代理类的XI的Target URL(这个内容详见三、集成生成器 Integration Builder下的第三小项)。然后再配置下系统表示等字段内容,就可以继续配置登陆数据。

在登录数据页签中输入登录SAP的账号信息。之后点击保存按钮就可以将目标对象保存都PO的配置系统中,在后续的使用过程中可以直接引用该对象即可。

(4)引用目标对象
这样的效果和上面的配置代理类通信通道的效果是一样的。
