外围系统与PO、SAP的请求响应通信过程大致可以用下图描述
(个人整理所得,可能有误,欢迎指正)
在SAP先开发一个RFC接口,示例如下
勾选远程启用的模块
需要提前将SAP的RFC注册到PO的ESB中,具体配置是PO顾问前期初始化的时候做的,应该是在SM59要配置PO和SAP的什么连接,这部分不是很清楚,猜测是下图的SM59连接
必须提前在开发PO的电脑上安装Java环境,我装的Java1.8是ok的
通过PO顾问给的POD地址:【http://{PO服务器域名}:50000//dir/start/index.jsp】进入POD页面
点击Enterprise Services Builder,下载Java小程序
运行Java小程序之后会见到如下页面,一般会按公司->对接系统->模块来分别新建版本->工作区->文件夹
在版本下新建DEMO系统的工作区,随后分模块将对应的接口放到各模块文件夹下,假设航班接口属于MM模块,则建立如下所示结构,建立完成需要保存并激活
如果PO顾问正确配置了ESB到SAP的连接,那下方的imported object处可以选择RFC,即前文提及的启用远程模块调用的接口,右键RFC,点击import of sap objects
依次输入SAP服务器地址,实例号,用户名和密码,点击continue
选中待导入的RFC,点击continue
最后点击finish,等待导入成功即可
导入完成需要激活
新建对象Mapping Object->Message Mapping
依次点击Definition->小方格->Source Message->Find Design Object
从中找到先前一步导入的RFC 结构YSEELEFM004,点击apply
依次点击Definition->小方格->Target Message->Find Design Object
从中找到先前一步导入的RFC 结构YSEELEFM004,点击apply
导入之后请求双方都有结构了,然后选中顶层节点,拖拽左侧的小点连线至右侧的小点
连接完成后两侧小点会变色,下方的面板处也会有两个节点的连线
在连接完顶层小点后,点击红色方框标注的按钮,即可自动完成字段名称相同字段的映射
这样外围系统的入参和SAP的入参就能mapping上了,前提是外围系统和SAP使用相同入参
和新建入参操作一致,只是需要选择出参的Response
最后效果如下
PO与外围系统是通过SI_OUT进行通信的(参考顶端图片SI_OUT部分),而PO与SAP是通过RFC直连(参考顶端图片RFC部分)通信,所以只需要配置一个PO与外围系统的SI即可
依次选择Outbound->Synchronous->RFC Message
请求的入参选择前方导入的RFC入参结构
请求的出参选择前方导入的RFC出参结构
正常如果要自定义请求的入参和出参,需要再额外构建DT和MT,但是直接使用RFC的结构可以省去该步骤
保存激活即可
Operation Mapping就是将出站和入站的SI(或RFC)服务接口串联起来
新建Operation Mapping操作映射
选中左侧source operation的行项目,添加服务
选择前一步创建的service interface
再选择右侧的target operation行项目
选择连接到SAP系统的RFC服务
选择下方的message mapping
再选择之前创建的MM消息映射对象,就能将双方入参的数据进行映射
点击保存之后,可以看到下方多了request和response的页签,刚刚的MM消息映射只配置了外围系统->SAP的请求消息映射,还需要配置一个SAP->外围系统的响应消息映射
转到response页签,这次选择响应的消息映射
保存激活即可
通过PO顾问给的POD地址:【http://{PO服务器域名}:50000//dir/start/index.jsp】进入POD页面
点击Integration Builder,下载Java小程序
展开 Communication Comonent Without Party,其中 Business System 和 Business Component 都可以定义SAP系统以及外部系统等通讯对象。一般 Business System 用于定义 SAP系统(如BS_DEV_300),Business Component 用于定义非SAP系统(如此处定义的外部调用方 BC_TEST_CX)
RFC信道接收来自Mapping转换后传递给PO RFC服务接口入参的XML报文,或接收来自SAP RFC接口的XML报文并传递给RFC服务接口
一般项目上一个Client建一个RFC接收信道就够了
在PO系统的对应BS_400中新建信道,作为RFC的接收信道
输入信道描述,选择适配器类型为RFC
由于SAP作为接收方,勾选Receiver
输入SAP Client的服务器信息和登录信息
登录账号需具有通讯账号权限,避免使用用户账户,否则达到用户账号重置密码期限时接口访问会失效
保存激活即可
REST信道接收来自外围系统的JSON报文,传递给SI_OUT使其能进入Mapping阶段;或接收来自SI_OUT转换完的JSON报文,返回给外围系统
在BC下新建BC_DEMO系统,一个外围系统方建一个BC就好了
双击BC_DEMO系统,添加2.5小节新建的SI_OUT发送端服务接口到该系统下
在BC_DEMO系统创建航班查询REST 发送信道
输入信道名称
选择REST的接收器类型
参数的解释参考下图,照样填写即可
Element Namespace:urn:sap-com:document:sap:rfc:functions
往下滑还有别的内容,参数的解释参考下图,照样填写即可
往下滑还有别的内容
照下图填写即可,一定要做这件事儿
Q:为什么要这么填?
A:SAP的item节点代表内表,如果不指明item节点的数据类型是数组,在内表XML转换成JSON的时候,如果此时内表只有一行,那转换成JSON之后会被认为是对象而不是数组,大部分外围系统接收到这样的报文会异常;只有在内表行数大于一行时,在内表XML转换成JSON的时候才会被识别成内表。所以一定要记得在这里加上item(小写的),并设置Array Type = 1
Q:为什么JSON转换出来的报文,如果CHAR类型的纯数字会被认为是数字而不是字符串(具体表现就是INT没有引号,字符串有引号)?
A:猜测是PO转换报文的时候,因为RFC返回的XML报文没有指定数据类型,所以纯数字的CHAR类型在转换的时候被识别成了数字,如果要固定将CHAR类型参数转换为string,必须在PO的此处指明string,否则会出现上述问题
Q:为什么JSON转换出来的SAP QUAN或者CURR类型在转换之后是string,而且在最后带一个空格?
A:SAP的QUAN和CURR的类型有些带符号位,所以最后面有个空格,解决方法是在PO的ESB端Mapping阶段,在返回的Mapping对象处找到待处理的字段,使用Trim函数去除数字尾部的空格
保存激活即可
集成配置用来处理入站和出站的请求,将外围系统不同类型的请求分配到指定的信道中,并在最后返回对方响应
新建集成配置
选择接收的REST信道
这里勾选的目的是为了让PO记录日志
PO的发布的接口地址模式比较固定
http://{服务器地址}:{端口号}/{适配器类型}/{路径后缀}
前面发布的REST接口地址就可以按以下模式填写(路径后缀在3.2.2节定义)
http://{PO服务器地址}:50000/RESTAdapter/ERP/YSEELEFM004
PO发的接口是有基本鉴权的,需要在Postman中添加basic auth,账号和密码是访问PO的账号和密码
SAP向PO发送Json的报文规则如下
日期:
{
"DATE": "2023-12-16"
}
数字:
{
"NUM": 3.1415
}
或
{
"NUM": "3.1415"
}
字符串:
{
"STRING": "ABCDEF"
}
结构:
{
"STRUCTURE": {
"AGE": 18,
"NAME": "Seele",
"BIRTH_DATE: "2023-12-16"
}
}
内表:
{
"INTERNAL_TABLE": {
"item": [
{
"AGE": 18,
"NAME": "Seele",
"BIRTH_DATE": "2002-10-18"
},
{
"AGE": 18,
"NAME": "Bronya",
"BIRTH_DATE": "2002-08-18"
}
]
}
}
当前PO接口的测试报文如下
{
"IS_CARRID": "LH",
"IT_FLDATE": {
"item": [
{
"SIGN": "I",
"OPTION": "BT",
"LOW": "1994-02-28",
"HIGH": "1999-02-28"
}
]
}
}
打开POD界面,点击Configuration and Monitoring Home
转到Monitoring->Adapter Engine->Message Monitor
可以在下方看到成功/失败的报文
点击失败的报文的数字,进入到该页面可以看详细信息,点击下方失败的请求
点击message log可以查看PO返回的接口失败日志,这里就是RFC适配器登录信息填错了所以报错了
点击成功的报文的数字,进入到该页面可以看详细信息
选中成功的消息,点击Open Message
第0行是外围系统传入的报文
第1行是PO加上外层元素准备传入RFC的报文
第2行是PO传入RFC的报文
第3行是RFC返回PO的报文
第4行是PO将RFC的XML转换成JSON并删除最外层元素后返回给外围系统的报文