美文网首页
SAP的CPI发布接口RFC

SAP的CPI发布接口RFC

作者: 想跳出大海的鱼 | 来源:发表于2021-12-10 19:39 被阅读0次

在属性里面选择远程启用模块SAP CPI 开发RFC适配器的Integration Flow

开发RFC适配器的Integration Flow

首先开发RFC(Remote Function Call)接口

Integration Suite发布Rest服务

开发RFC适配器的Iflow

创建包

添加Integration flow

开发iFlow

测试

首先开发RFC(Remote Function Call)接口

TCODE:SE37

在属性里面选择远程启用模块

然后写入源码,比如数据查询

至此,RFC接口完毕

Integration Suite发布Rest服务

开发RFC适配器的Iflow

创建包

和ABAP里的程序需要存储在一个开发包里一样,Integration flow也需要存储在一个包里,称为Content package.

添加Integration flow

创建这个包就不讲了,我就选择自己之前的一个包,直接开始添加Integration flow

开发iFlow

点击刚刚创建的iFlow

1、sender连接start,选择https

双击https的连线,修改Address

下图的CSRF不要勾上,如果勾上就只能是get方式访问,不勾的话,get和post都可以访问。

2、选择groovy script

删除里面的代码,换成自己的,然后点击右上角ok

代码

import com.sap.gateway.ip.core.customdev.util.Message;

import java.util.HashMap;

def Message processData(Message message) {

    def headers = message.getHeaders();

    def map = message.getProperties();

    message.setHeader("SAP_IsIgnoreProperties", new Boolean(true));

    message.setHeaders(headers);

    def head = headers as String;

    def body = message.getBody(java.lang.String) as String;

    def messageLog = messageLogFactory.getMessageLog(message);

    messageLog.addAttachmentAsString("PayloadRequest", body, "text/plain");

    return message;

}

上面这段代码的意思就是请求的时候添加上一个附件

3、接收请求,Json转xml

双击,改成如下

4、接收,消息映射

取名,点击create

左边是导入自己写的xsd文件,右边是sap系统里面导出的wsdl文件。

先来左边。

桌面上放上xsd文件,内容如下,自己对照着修改

<schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema">

    <element name="ZSD_CRM_1011_Request">

        <complexType>

            <sequence>

                            <element name="IV_MATNR" type="string">

</element>

            </sequence>

        </complexType>

    </element>

</schema>

上面就代表着只有一个输入参数,对应SE37那个RFC的那个输入参数。

如果传入的是表,那么就按照下面的方式写

<schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema">

    <element name="ZSD_CRM_1011_Request">

        <complexType>

            <sequence>

                <element name="IT_INPUT" minOccurs="0" maxOccurs="unbounded">

                    <complexType>

                        <sequence>

                            <element name="NAME1" type="string">

</element>

                            <element name="NAME2" type="string">

</element>

                            <element name="NAME2" type="string">

</element>

                        </sequence>

                    </complexType>

                </element>

            </sequence>

        </complexType>

    </element>

</schema>

点击左边的Add Source

选择自己桌面上那个xsd

然后右边。

右边需要获取RFC的WSDL

获取RFC的WSDL地址为:http://<host>:<port>/sap/bc/soap/wsdl11?services=<BAPI Name>&sap-client=<client>&sap-user=<user>&sap-password=<password>

自己改地址,端口号,services后面是函数名,系统,用户,密码

(注意:保存下来的文件扩展名是.wsdl,不能是xml,自己手动改一下)

点击右边的Add ,然后upload,选择刚刚保存的wsdl文件

连线,把左右映射起来

注意:REQUEST的消息映射如果传入的是空的。那么左边是自己的xsd,右边是系统的wsdl,在这个wsdl里面有RFC的函数名,这样SCC才知道是调用的哪个函数。左右两边加上文件即可,不需要连线映射上。消息映射为空时的xsd,如下:

<schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema">

    <element name="ZSD_CRM_1009_Request">

    </element>

</schema>

传入的如果为空也有另一种方式,不用message mapping,改用content modify,如下,在里面的body上写上内容,这样也可以指定到要调用的RFC函数

然后点击右上角ok

5、添加Request Reply

6、添加SAP系统作为接收方

7、调用SAP系统选择RFC

双击RFC的连接线

Destination是在子账号里面的Destinations定义

8、然后跟前面一样,再添加一个消息映射,这个是返回的消息映射

左边是系统的wsdl文件,像之前一样,但是选择第二个Response。

右边是自己写的xsd文件

右边的xsd:是一个内表

<schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema">

    <element name="ZSD_CRM_1011_Response">

        <complexType>

            <sequence>

                <element name="ET_OUTPUT" minOccurs="0" maxOccurs="unbounded">

                    <complexType>

                        <sequence>

                            <element name="MATNR" type="string">

</element>

                            <element name="WERKS" type="string">

</element>

                            <element name="LGORT" type="string">

</element>

                            <element name="ZSTOCK" type="string">

</element>

                            <element name="MSGTYP" type="string">

</element>

                            <element name="MSGTEXT" type="string">

</element>

                        </sequence>

                    </complexType>

                </element>

            </sequence>

        </complexType>

    </element>

</schema>

9、再添加一个xml转json

1、(勾上supress json root element可以去掉返回结果里最外层的ZSD_CRM_1011_Response,见下图)

2、(然后勾上Streaming,在下面XML Element添加上最外层的和内表名字,一定要从最外层开始写,即便上面勾上supress json root element去掉了外层。这里是为了让每次返回的都是一个json数组,即便只有一条数据,如果不这样做,那么返回一条数据时,就不是个json数组,单是一条数据了。见下图)

10、最后加一个groovy script

内容:

import com.sap.gateway.ip.core.customdev.util.Message;

import java.util.HashMap;

def Message processData(Message message) {

    def body = message.getBody(java.lang.String) as String;

    def messageLog = messageLogFactory.getMessageLog(message);

    messageLog.addAttachmentAsString("PayloadResponse",body, "text/plain");

    return message;

}

这里是在返回加上的一个附件

就完成了。

注意,需要到SCC里面添加上自己的RFC函数)

测试

先拿到地址

地址见下图右边的endpoint

然后postman

版权声明:本文为CSDN博主「尤其是十月的风」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_34060435/article/details/119883131

相关文章

网友评论

      本文标题:SAP的CPI发布接口RFC

      本文链接:https://www.haomeiwen.com/subject/ewfhfrtx.html