在本文中,我们将了解如何在 PI/PO 接口中处理传入消息中的附件。我们将介绍涉及附件的用例;用于处理附件的 Java 类;以及可用于处理附件的 Java 类的方法。
然后,我们将构建一个 Java 映射,以读取附件有效负载并将其从 XI 消息复制到目标。此外,我们将逐步检查如何在 ESR 和 ID 中开发和配置端到端接口。
集成场景中附件的用例
在系统集成方面,许多协议都具有发送带有主要消息负载的附件的能力。因此,在通过 SAP PI/PO 构建 SAP 集成方案时,您会遇到应处理附件的接口。
以下是一些示例,其中应在 SAP PI/PO 中管理消息中的附件。此外,您可以在链接的文章中阅读有关使用 GOS 处理 SAP 文档的附件的信息。
SOAP 消息中的附件
SOAP(简单对象访问协议)具有与主消息有效负载交换附件的能力。将SAP与SOAP服务集成时,接口应能够从SOAP消息中读取附件数据或将附件写入SOAP消息。
Zip 文件处理
通常,压缩或压缩的文件内部包含多个文件。例如,一个 zip 文件可以包含一个 XML 作为主要负载和多个 PDF。在这种情况下,PDF 将作为附件分配给 XI 有效负载。
本文与我之前关于如何在 PI/PO 中处理 zip 文件的文章密切相关。
带附件的邮件
在大多数情况下,电子邮件包含一个或多个附件。通过邮件适配器集成电子邮件时,应构建界面以处理电子邮件中的附件。
Java 类 InputAttachments
我们可以使用 Java 类接口 InputAttachments 及其方法来读取 XI 消息中的附件。Java 类可用于用户定义函数 (UDF) 或 Java 映射程序。此类包含在源路径 com.sap.aii.mapping.api 中。
该类有三种方法来处理 XI 有效负载中的附件。它们是 getAllContentIds、areAttachmentsAvailable 和 getAttachment。
getAllContentIds 方法
此方法将源负载的所有附件 ID 以字符串集合的形式返回。源负载中的每个附件都有一个唯一的 ID,称为内容 ID。使用此方法,您可以将 XI 消息中所有附件的内容 ID 作为一个集合来获取。
方法 areAttachmentsAvailable
如方法名称所示,我们可以使用此方法来检查 XI 有效负载中是否存在附件。此外,可以从消息映射程序访问有效负载中的附件。
只有在操作映射中激活了“Read Attachmen”选项时,映射程序才能访问有效负载中的附件。
Operation Mapping中标记的“读取附件”选项
getAttachment 方法
此方法返回特定内容 ID 的 Attachment 对象。
语法:附件 getAttachment(String contentID)
attachment 对象由一组方法组成,这些方法可以读取不同格式的附件内容。此外,它还包含识别附件类型的方法。
方法名称 | 语法 | 目的 | 返回类型 |
获取内容 | byte[] getContent() | 以字节数组的形式返回附件的实际内容。 | byte[] |
getContentType | String getContentType() | 返回附件的类型。例如,pdf、txt、jpg等。 | String |
getBase64EncodedContent | String getBase64EncodedContent() | 以 base64 编码格式返回附件的实际内容。 | String |
Base64 架构是处理附件的好方法。
集成方案概述
为了说明附件处理,我们假设我们有一个 SFTP 服务器,其中存储了 zip 文件。每个 zip 文件都包含一个发票 XML 和发票的相应 PDF 文件。我们想要提取 zip 文件并将发票 XML 和 PDF 传输到接收方 SFTP 服务器中的两个不同位置。
附件处理演示方案概述
发送方 SFTP 适配器读取 zip 文件,并使用适配器模块 AF_Modules/PayloadZipBean 将其解压缩。解压缩 zip 文件后,源消息将包含发票 XML 和 PDF。
让我们使用两个映射程序来处理 zip 文件内容。
- 一个图形消息映射程序,用于将源发票 XML 映射到接收方发票 XML 格式。
- 一个 Java Mapping 程序,用于从源消息中读取 PDF 附件数据并将内容复制到输出流。
如果要将 PDF 作为代理消息发送到 SAP 后端系统,一种可能的方法是使用 getBase64EncodedContent 将附件内容转换为 base64 格式。
用于处理源消息中的附件的 Java 映射
使用我们在本文前面讨论的 Java 接口 InputAttachment,Java Mapping 程序读取 PDF 附件的内容并将其复制到输出流中。
首先,附件处理程序是从 getInputAttachments 方法生成的。其次,循环附件处理程序以获取附件的内容 ID。在我们的场景中,有效负载中只有一个附件。最后,通过应用 getContent 方法读取附件的内容,并将其分配给输出。
package readAttachment;
import java.io.*;
import com.sap.aii.mapping.api.*;
public class CopyPDFtoPayload extends AbstractTransformation{
@Override
public void transform(TransformationInput transformationInput, TransformationOutput transformationOutput) throws StreamTransformationException {
try {
//Get the handler for processing the attachments of source message
InputAttachments attachment = transformationInput.getInputAttachments();
InputStream inputstream = transformationInput.getInputPayload().getInputStream();
OutputStream outputstream = transformationOutput.getOutputPayload().getOutputStream();
//Fetch the collection of attachments in the source message
for (String id : attachment.getAllContentIds(false)) {
//Read the content of the attachment and assign the content to output
outputstream.write((attachment.getAttachment(id)).getContent());
}
} catch (Exception exception) {
getTrace().addDebugMessage(exception.getMessage());
throw new StreamTransformationException(exception.toString());
}
}
}
Enterprise Service Repository 中的配置
现在,我们来看一下ESR中的分步配置。
创建源消息类型
我们以发件人消息类型表示发票 XML 的格式。
发票 XML 源数据类型和消息类型
有关主要负载的源消息类型,请参阅这篇关于 zip 文件处理集成方案的文章。
构建出站服务接口
使用上一步创建的发送者消息类型,开发发送者服务接口。
用于输入带有附件的消息的出站服务接口
定义目标消息类型
我们将创建两种目标消息类型:一种用于发票 XML 接收器,另一种用于 PDF。但是,与用于 PDF 接收器的消息类型的元素/属性的实际消息格式无关,因为我们正在将 PDF 的内容复制到输出流中。由于 SAP PI/PO 中的消息映射程序需要消息类型,因此我们必须创建一个消息类型。
PDF 的消息类型:PDFPayload
PDF 附件的摘要数据类型
配置两个入站服务接口
我们将构建两个Inbound Service Interfaces:一个用于发票 XML 接收器,另一个用于 PDF 接收器。
PDF 附件的Inbound Service Interface:PDFPayload_Inb_Async
查看有关 SAP PI/PO 中 zip 文件处理的帖子,了解发票 XML 服务接口开发步骤。
Message Mapping and Operation Mapping
我们将以通常的方式构建一个图形映射程序,将发件人发票XML格式映射到目标发票XML格式。在此示例中,发送方和接收方的消息格式完全相同,因此映射是一对一的。
构建Imported Archives以进行附件处理
使用文章中提供的 Java 代码配置 Imported Archives。我们将 Imported Archive 或 Java Mapping 命名为 copyPDFAttachment。
导入的存档以复制附件内容
配置 PDF 附件处理的Operation Mapping
使用上述步骤中开发的 Java Mapping,在发送方出站服务接口和 PDF 接收方入站服务接口之间创建Operation Mapping 。我们将 Operation Mapping 命名为 PDFAttachment_to_Payload。
PDF 附件处理的操作映射
目标数据结构“PDFPayload”已过时,因为我们使用 Java 映射来复制 PDF 内容。
iFlow 和集成配置开发步骤
现在我们已经在 ESR 中设计了所有必要的对象,让我们在 NWDS Eclipse 中配置端到端的 iFlow。
iFlow概览
在这里,我们通过Eclipse NWDS作为iFlow实现的端到端附件处理接口。
发送方系统和发送方服务接口
发送方系统已BC_TEST_SENDER,入站服务接口名称为 InvoiceXMLwithAttachment_Out_Async。
Sender System Outbound Service Interface
附件 Sender SFTP Adapter
发送方通信通道的适配器类型为 SFTP,其名称为 SFTP_s_ZIP。此通道从 SFTP 服务器获取 zip 文件。
Zip file sender Communication Channe
本文提供了如何配置发送方 SFTP 通信通道的适配器模块以解压缩输入消息。
附件 Receiver Service Interfaces
接收接口:PDFPayload_Inb_Async ,
接收组件 : BC_TEST_RECEIVER.
Inbound Service Interface for PDF Attachment
附件 PDF 接收通道
SFTP_r_PDF通道将 PDF 文件写入指定文件夹。
PDF Receiver Communication Channel
附件处理 Operation Mapping
PDF Attachment Processing Operation Mapping
测试集成方案
让我们将一个包含发票 XML 和 PDF 的 zip 文件放在 zip 文件发件人 SFTP 文件夹中。
Sender zip file in SFTP Server
首先,发送方 SFTP 适配器将使用适配器模块 PayloadZipBean 解压缩invoice.zip。Invoice.xml将被分配为 XI 消息的主要有效载荷,PDF 将作为第一个附件分配给消息。
Content of zip file: Invoice XML and PDF Attachment
附件处理接口处理步骤
让我们看一下 PI/PO 消息监视器中接口的处理管道。
消息监视器中的消息处理
Overview of messages in Message Monitor
文件从发件人适配器解压缩
由发送器适配器解压缩的输入 zip 文件 – 消息日志
XI 消息内容中的主要负载和附件
XI Message content, Main Payload, and Attachment
入站Message分割成两条
Input message split into two messages
通过 Java Mapping处理的附件
Attachment copied by Java Mapping
PDF 有效载传送到附件接收器通道
![](https://i-blog.csdnimg.cn/direct/ddb9864435f9411ca0bf9d29b8551cb4.png)
附件 PDF 保存在接收器 SFTP 位置
PDF attachment written to SFTP server
提示和技巧:
由于 XI 消息包含两个有效载荷,并且我们使用两个单独的接收器通道将它们发送到目标,因此需要在接收器通信通道中停用附件存储选项。如果在接收器上激活“Store Attachmen”选项,则每个接收器通信通道将接收两个有效载荷。
Store attachments” option deactivated at the receiver adapter