外围系统与PO、SAP的请求响应通信过程大致可以用下图描述
(个人整理所得,可能有误,欢迎指正)
以A系统的RFC发布WebService接口
RFC发布WebService接口
获取到WSDL地址,下载WSDL文件到本地
SAP的WSDL文件有些特殊,需要把WSDL的Policy段注释掉,否则导入PO会出问题
需要提前将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模块,则建立如下所示结构,建立完成需要保存并激活
新建external definition 外部定义
选择WSDL文件,如果是SAP导出的WSDL需要把policy段注释掉,参考1.1节
点击导入后不报错就可以保存激活
新建对象Mapping Object->Message Mapping
依次点击Definition->小方格->Source Message->Find Design Object
依次打开对象直到选中先前导入的ED文件中的入参结构
依次点击Definition->小方格->Target Message->Find Design Object
依次打开对象直到选中先前导入的ED文件中的入参结构
导入之后请求双方都有结构了,然后选中顶层节点,拖拽左侧的小点连线至右侧的小点
连接完成后两侧小点会变色,下方的面板处也会有两个节点的连线
在连接完顶层小点后,点击红色方框标注的按钮,即可自动完成字段名称相同字段的映射
这样SAP的入参和外围系统的入参就能mapping上了,前提是SAP和外围系统使用相同入参
和新建入参操作一致,只是需要选择出参的Response
最后效果如下
SAP与PO是通过SI_OUT进行通信的(参考顶端图片SI_OUT部分),而PO与外围系统是通过SI_IN通信,所以需要分别配置PO与SAP的SI_OUT和PO与外围系统的SI_IN
新建SI_OUT
依次选择Outbound->Synchronous->External Message
请求的入参选择前方导入2.2节的入参ED结构
请求的出参选择前方导入2.2节的出参ED结构
正常如果要自定义请求的入参和出参,需要再额外构建DT和MT,但是直接使用ED的结构可以省去该步骤
新建SI_IN
依次选择Inbound->Synchronous->External Message
请求的入参选择前方导入2.2节的入参ED结构
请求的出参选择前方导入2.2节的出参ED结构
保存激活即可
Operation Mapping就是将出站和入站的SI服务接口串联起来
新建Operation Mapping操作映射
左侧选中SI_OUT,右侧选中SI_IN,下方的message mapping填入MM_REQ
(我下面的图里选错了,选到REST的MM_REQ了,排查了半天错误…各位同僚切勿粗心大意)
点击保存后,会出现Request的页签,刚刚的值其实都是在request当中的
(我下面的图里选错了,选到REST的MM_REQ了,排查了半天错误…各位同僚切勿粗心大意)
切到Response页签,下方的message mapping填入MM_REQ
保存激活即可
通过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)
SOAP信道接收来自SAP 代理类的XML请求报文并发给SI_OUT进入到Mapping,或接收来自外围系统SOAP接口Mapping后传递给SI_OUT服务接口的XML报文
新建BS_DEV_400 的SOAP CC信道
新建CC 信道对象
选择SOAP适配器,再选择消息协议XI 3.0,保存即可
SOAP信道发送来自Mapping后传递给SI_OUT的SAP XML报文;或接收来自外围系统的XML报文
在BC下新建BC_DEMO系统,一个外围系统方建一个BC就好了
双击BC_DEMO系统,添加2.5小节新建的SI_OUT发送端服务接口到该系统下
在BC_DEMO系统创建航班查询SOAP 接收信道
输入信道名称
选择SOAP的接收器类型
参考下图维护字段
SOAP接口地址是SOAP UI里面URL的地址,不要填成WSDL的地址了,不清楚就问外围系统直接要
保存激活即可
集成配置用来处理入站和出站的请求,将外围系统不同类型的请求分配到指定的信道中,并在最后返回对方响应
新建集成配置
选择发送的SOAP信道
这里勾选的目的是为了让PO记录日志
SPROXY进入代理类,一直点点点,找到service consumer下面的SI_OUT对象
双击SI_OUT对象
前缀给个Z就好了,也可以加上模块,然后点击完成即可
一般没啥要修改的,直接激活就好了
如果后续在PO的ED里面修改结构了需要在代理类这里点Regenerate重新生成,再激活一下
记下这个代理类的名字,后面会用
参考第5节的代理类名字,在程序里新建对象
用下述简单代码即可测试
DATA: lo_po TYPE REF TO zco_si_mm002_erp2demo_out,
ls_req TYPE zzdemo_temp032,
ls_res TYPE zzdemo_temp03response2.
lo_po = NEW #( ).
ls_req-it_fldate-item = VALUE #( ( sign = 'I' option = 'BT' low = '1990-01-01' high = '2000-01-01' ) ).
ls_req-et_data-item = VALUE #( ( carrid = '1' ) ).
TRY .
lo_po->si_mm002_erp2demo_out(
EXPORTING
output = ls_req
IMPORTING
input = ls_res
).
CATCH cx_root INTO DATA(lo_error).
DATA(lv_msg) = '接口异常'.
ENDTRY.
cl_demo_output=>display( ls_res ).
双击代理类,可以看到有个SI_OUT的方法
选中SI_OUT,切到参数,即可查看对应的传入传出参数类型
测试结果
实在是懒得再写一遍了,用REST那篇的内容复制过来了,方法基本类似
打开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并删除最外层元素后返回给外围系统的报文