在屬性里面選擇遠(yuǎn)程啟用模塊SAP CPI 開發(fā)RFC適配器的Integration Flow
開發(fā)RFC適配器的Integration Flow
首先開發(fā)RFC(Remote Function Call)接口
Integration Suite發(fā)布Rest服務(wù)
首先開發(fā)RFC(Remote Function Call)接口
TCODE:SE37

在屬性里面選擇遠(yuǎn)程啟用模塊

然后寫入源碼,比如數(shù)據(jù)查詢

至此,RFC接口完畢
Integration Suite發(fā)布Rest服務(wù)



和ABAP里的程序需要存儲(chǔ)在一個(gè)開發(fā)包里一樣,Integration flow也需要存儲(chǔ)在一個(gè)包里,稱為Content package.

添加Integration flow
創(chuàng)建這個(gè)包就不講了,我就選擇自己之前的一個(gè)包,直接開始添加Integration flow



開發(fā)iFlow
點(diǎn)擊剛剛創(chuàng)建的iFlow


1、sender連接start,選擇https


雙擊https的連線,修改Address

下圖的CSRF不要勾上,如果勾上就只能是get方式訪問,不勾的話,get和post都可以訪問。

2、選擇groovy script


刪除里面的代碼,換成自己的,然后點(diǎn)擊右上角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;
}
上面這段代碼的意思就是請(qǐng)求的時(shí)候添加上一個(gè)附件
3、接收請(qǐng)求,Json轉(zhuǎn)xml

雙擊,改成如下

4、接收,消息映射


取名,點(diǎn)擊create


左邊是導(dǎo)入自己寫的xsd文件,右邊是sap系統(tǒng)里面導(dǎo)出的wsdl文件。
先來左邊。
桌面上放上xsd文件,內(nèi)容如下,自己對(duì)照著修改
<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>
上面就代表著只有一個(gè)輸入?yún)?shù),對(duì)應(yīng)SE37那個(gè)RFC的那個(gè)輸入?yún)?shù)。
如果傳入的是表,那么就按照下面的方式寫
<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>
點(diǎn)擊左邊的Add Source

選擇自己桌面上那個(gè)xsd

然后右邊。
右邊需要獲取RFC的WSDL
獲取RFC的WSDL地址為:http://<host>:<port>/sap/bc/soap/wsdl11?services=<BAPI Name>&sap-client=<client>&sap-user=<user>&sap-password=<password>
自己改地址,端口號(hào),services后面是函數(shù)名,系統(tǒng),用戶,密碼
(注意:保存下來的文件擴(kuò)展名是.wsdl,不能是xml,自己手動(dòng)改一下)

點(diǎn)擊右邊的Add ,然后upload,選擇剛剛保存的wsdl文件

連線,把左右映射起來

注意:REQUEST的消息映射如果傳入的是空的。那么左邊是自己的xsd,右邊是系統(tǒng)的wsdl,在這個(gè)wsdl里面有RFC的函數(shù)名,這樣SCC才知道是調(diào)用的哪個(gè)函數(shù)。左右兩邊加上文件即可,不需要連線映射上。消息映射為空時(shí)的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上寫上內(nèi)容,這樣也可以指定到要調(diào)用的RFC函數(shù)

然后點(diǎn)擊右上角ok
5、添加Request Reply


6、添加SAP系統(tǒng)作為接收方



7、調(diào)用SAP系統(tǒng)選擇RFC
雙擊RFC的連接線

Destination是在子賬號(hào)里面的Destinations定義
8、然后跟前面一樣,再添加一個(gè)消息映射,這個(gè)是返回的消息映射

左邊是系統(tǒng)的wsdl文件,像之前一樣,但是選擇第二個(gè)Response。
右邊是自己寫的xsd文件

右邊的xsd:是一個(gè)內(nèi)表
<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、再添加一個(gè)xml轉(zhuǎn)json


1、(勾上supress json root element可以去掉返回結(jié)果里最外層的ZSD_CRM_1011_Response,見下圖)

2、(然后勾上Streaming,在下面XML Element添加上最外層的和內(nèi)表名字,一定要從最外層開始寫,即便上面勾上supress json root element去掉了外層。這里是為了讓每次返回的都是一個(gè)json數(shù)組,即便只有一條數(shù)據(jù),如果不這樣做,那么返回一條數(shù)據(jù)時(shí),就不是個(gè)json數(shù)組,單是一條數(shù)據(jù)了。見下圖)


10、最后加一個(gè)groovy script

內(nèi)容:
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;
}
這里是在返回加上的一個(gè)附件
就完成了。

注意,需要到SCC里面添加上自己的RFC函數(shù))
先拿到地址

地址見下圖右邊的endpoint

然后postman


版權(quán)聲明:本文為CSDN博主「尤其是十月的風(fēng)」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_34060435/article/details/119883131