PO 发布REST->RFC同步接口
通信概览图
外围系统与PO、SAP的请求响应通信过程大致可以用下图描述
(个人整理所得,可能有误,欢迎指正)
1. 前期准备
1.1 SAP端
在SAP先开发一个RFC接口,示例如下
勾选远程启用的模块
1.2 PO端
需要提前将SAP的RFC注册到PO的ESB中,具体配置是PO顾问前期初始化的时候做的,应该是在SM59要配置PO和SAP的什么连接,这部分不是很清楚,猜测是下图的SM59连接
1.3 个人PC
必须提前在开发PO的电脑上安装Java环境,我装的Java1.8是ok的
2. Enterprise Services Repository
2.1 建立工作区
通过PO顾问给的POD地址:【http://{PO服务器域名}:50000//dir/start/index.jsp】进入POD页面
点击Enterprise Services Builder,下载Java小程序
运行Java小程序之后会见到如下页面,一般会按公司->对接系统->模块来分别新建版本->工作区->文件夹
在版本下新建DEMO系统的工作区,随后分模块将对应的接口放到各模块文件夹下,假设航班接口属于MM模块,则建立如下所示结构,建立完成需要保存并激活
2.2 导入RFC
如果PO顾问正确配置了ESB到SAP的连接,那下方的imported object处可以选择RFC,即前文提及的启用远程模块调用的接口,右键RFC,点击import of sap objects
依次输入SAP服务器地址,实例号,用户名和密码,点击continue
选中待导入的RFC,点击continue
最后点击finish,等待导入成功即可
导入完成需要激活
2.3 新建入参Mapping映射
新建对象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使用相同入参
2.4 新建出参Mapping映射
和新建入参操作一致,只是需要选择出参的Response
最后效果如下
2.5 新建Service Interface
PO与外围系统是通过SI_OUT进行通信的(参考顶端图片SI_OUT部分),而PO与SAP是通过RFC直连(参考顶端图片RFC部分)通信,所以只需要配置一个PO与外围系统的SI即可
依次选择Outbound->Synchronous->RFC Message
请求的入参选择前方导入的RFC入参结构
请求的出参选择前方导入的RFC出参结构
正常如果要自定义请求的入参和出参,需要再额外构建DT和MT,但是直接使用RFC的结构可以省去该步骤
保存激活即可
2.6 新建Operation Mapping
Operation Mapping就是将出站和入站的SI(或RFC)服务接口串联起来
新建Operation Mapping操作映射
选中左侧source operation的行项目,添加服务
选择前一步创建的service interface
再选择右侧的target operation行项目
选择连接到SAP系统的RFC服务
选择下方的message mapping
再选择之前创建的MM消息映射对象,就能将双方入参的数据进行映射
点击保存之后,可以看到下方多了request和response的页签,刚刚的MM消息映射只配置了外围系统->SAP的请求消息映射,还需要配置一个SAP->外围系统的响应消息映射
转到response页签,这次选择响应的消息映射
保存激活即可
3. Intergration Builder
通过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)
3.1 建立BS-RFC Communication Chanel接收信道
RFC信道接收来自Mapping转换后传递给PO RFC服务接口入参的XML报文,或接收来自SAP RFC接口的XML报文并传递给RFC服务接口
一般项目上一个Client建一个RFC接收信道就够了
在PO系统的对应BS_400中新建信道,作为RFC的接收信道
输入信道描述,选择适配器类型为RFC
由于SAP作为接收方,勾选Receiver
输入SAP Client的服务器信息和登录信息
登录账号需具有通讯账号权限,避免使用用户账户,否则达到用户账号重置密码期限时接口访问会失效
保存激活即可
3.2 建立BC-REST Communication Chanel发送信道
REST信道接收来自外围系统的JSON报文,传递给SI_OUT使其能进入Mapping阶段;或接收来自SI_OUT转换完的JSON报文,返回给外围系统
在BC下新建BC_DEMO系统,一个外围系统方建一个BC就好了
双击BC_DEMO系统,添加2.5小节新建的SI_OUT发送端服务接口到该系统下
在BC_DEMO系统创建航班查询REST 发送信道
输入信道名称
选择REST的接收器类型
3.2.1 General页签
参数的解释参考下图,照样填写即可
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函数去除数字尾部的空格
3.2.2 REST Resource页签
3.2.3 REST Operation页签
保存激活即可
3.3 建立Integrated Configuration 集成配置
集成配置用来处理入站和出站的请求,将外围系统不同类型的请求分配到指定的信道中,并在最后返回对方响应
新建集成配置
3.3.1 Inbound Processing页签
选择接收的REST信道
3.3.2 Reciver 页签
3.3.3 Outbound Processing 页签
3.3.4 Reciver Interface 页签
3.3.5 Advanced Settings 页签
这里勾选的目的是为了让PO记录日志
4. Postman 测试REST接口
4.1 接口地址
PO的发布的接口地址模式比较固定
http://{服务器地址}:{端口号}/{适配器类型}/{路径后缀}
前面发布的REST接口地址就可以按以下模式填写(路径后缀在3.2.2节定义)
http://{PO服务器地址}:50000/RESTAdapter/ERP/YSEELEFM004
4.2 接口鉴权
PO发的接口是有基本鉴权的,需要在Postman中添加basic auth,账号和密码是访问PO的账号和密码
4.3 接口报文
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"
}
]
}
}
5. 消息查看器查看报文
打开POD界面,点击Configuration and Monitoring Home
转到Monitoring->Adapter Engine->Message Monitor
可以在下方看到成功/失败的报文
5.1 失败的PO日志
点击失败的报文的数字,进入到该页面可以看详细信息,点击下方失败的请求
点击message log可以查看PO返回的接口失败日志,这里就是RFC适配器登录信息填错了所以报错了
5.2 查看PO报文Payload
点击成功的报文的数字,进入到该页面可以看详细信息
选中成功的消息,点击Open Message
第0行是外围系统传入的报文
第1行是PO加上外层元素准备传入RFC的报文
第2行是PO传入RFC的报文
第3行是RFC返回PO的报文
第4行是PO将RFC的XML转换成JSON并删除最外层元素后返回给外围系统的报文
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!