在 MIME 域中处理消息

本主题解释了如何处理属于 MIME 域以及由 MIME 解析器解析的消息。结合使用消息体内容中的信息使用该信息。

MIME 消息不一定要在特定传输机制上进行接收。例如,可以使用 HTTPInput 节点通过 HTTP 接收消息,或者使用 MQInput 节点通过 WebSphere MQ 接收消息。MIME 解析器用于在以下某种条件适用时处理消息:

在消息传递到消息流中的其他节点上之前,可以使用 ESQL 处理逻辑树。消息流也可以使用 ESQL 创建 MIME 域树。当 MIME 域消息到达输出节点时,将调用 MIME 解析器以从逻辑树重新构建位流。

以下示例显示了如何处理 MIME 消息:

创建新的 MIME 树

消息流通常接收、修改和返回 MIME 消息。在这种情况中,您可以处理在解析输入消息时创建的有效 MIME 树。如果消息流接收来自另一个域(例如 XML)的输入,并返回 MIME 消息,您就需要创建有效的 MIME 树。在 Compute 节点中使用以下 ESQL 为单段式 MIME 树创建顶级结构:
CREATE FIELD OutputRoot.MIME TYPE Name;
DECLARE M REFERENCE TO OutputRoot.MIME;
CREATE LASTCHILD OF M TYPE Name NAME 'Data';
消息流还需要确保已正确设置 MIME Content-Type,如管理 Content-Type中说明的那样。然后,消息流需要将消息数据添加到 MIME 树中。以下 ESQL 给出了如何完成这一操作的示例。注意:在每种情况中,Data 都是使用域 BLOB 创建的。
  • 使用树的其他部分中的位流。以下示例显示了如何从消息流接收到的 XML 消息中创建位流。然后,消息流调用 BLOB 解析器将数据存储在 Data 元素下。
     DECLARE partData BLOB ASBITSTREAM(InputRoot.XML);
     CREATE LASTCHILD OF M.Data DOMAIN('BLOB') PARSE(partData);
  • 并非创建位流,而是创建新结构,然后向其添加数据。以下 ESQL 是如何执行该操作的示例:
    DECLARE partData BLOB ASBITSTREAM(InputRoot.XML);
    CREATE LASTCHILD OF M.Data DOMAIN('BLOB') NAME 'BLOB';
    CREATE LASTCHILD OF M.Data.BLOB NAME 'BLOB' VALUE partData;

这两个方法创建相同的树结构。建议使用第一个方法,因为 BLOB 解析器要求明确了解的树结构并不是构建到流中。

更常见的是,Compute 节点需要为多段式 MIME 文档构建树。以下 ESQL 是您如何执行该操作(包括通过 ContentType 属性设置顶级 Content-Type)的示例:
DECLARE part1Data BLOB ASBITSTREAM(InputRoot.XML.part1);
DECLARE part2Data BLOB ASBITSTREAM(InputRoot.XML.part2);

SET OutputRoot.Properties.ContentType = 'multipart/related; boundary=myBoundary';

CREATE FIELD OutputRoot.MIME TYPE Name;
DECLARE M REFERENCE TO OutputRoot.MIME;
CREATE LASTCHILD OF M TYPE Name NAME 'Parts';
CREATE LASTCHILD OF M.Parts TYPE Name NAME 'Part';
DECLARE P1 REFERENCE TO M.Parts.Part[1];
CREATE FIELD P1."Content-Type" TYPE NameValue VALUE 'text/plain';
CREATE FIELD P1."Content-Id" TYPE NameValue VALUE 'part one';
CREATE LASTCHILD OF P1 TYPE Name NAME 'Data';
CREATE LASTCHILD OF P1.Data DOMAIN('BLOB') PARSE(part1Data);

CREATE LASTCHILD OF M.Parts TYPE Name NAME 'Part';
DECLARE P2 REFERENCE TO M.Parts.Part[2];
CREATE FIELD P2."Content-Type" TYPE NameValue VALUE 'text/plain';
CREATE FIELD P2."Content-Id" TYPE NameValue VALUE 'part two';
CREATE LASTCHILD OF P2 TYPE Name NAME 'Data';
CREATE LASTCHILD OF P2.Data DOMAIN('BLOB') PARSE(part2Data);

修改现有的 MIME 树

以下示例 ESQL 将新的 MIME 部分添加到现有的多段式 MIME 消息中。如果消息不是多段式消息,则不会修改它:
SET OutputRoot = InputRoot;

-- Check to see if the MIME message is multipart or not.
IF LOWER(InputProperties.ContentType) LIKE 'multipart/%'
THEN
  CREATE LASTCHILD OF OutputRoot.MIME.Parts NAME 'Part';

  DECLARE P REFERENCE TO OutputRoot.MIME.Parts.[<];
  CREATE FIELD P."Content-Type" TYPE NameValue VALUE 'text/xml';
  CREATE FIELD P."Content-ID" TYPE NameValue VALUE 'new part';
  CREATE LASTCHILD OF P TYPE Name NAME 'Data';

  -- This is an artificial way of creating some BLOB data.
  DECLARE newBlob BLOB '4f6e652074776f2074687265650d0a';
  CREATE LASTCHILD OF P.Data DOMAIN('BLOB') PARSE(newBlob);
END IF;

管理 Content-Type

当您创建新的 MIME 消息树,或者当您修改 MIME 边界字符串的值时,您必须确保已正确设置了 MIME Content-Type 头。在代理的 Properties 子树中设置 ContentType 值可执行该操作。以下示例显示了为具有简单内容的 MIME 部分设置 ContentType 值:
SET OutputRoot.Properties.ContentType = 'text/plain';
请不要直接在 MIME 树或 HTTP 树中设置 Content-Type 的值。这会导致该值被忽略或者以不一致的方式使用。
相关概念
MIME 解析器和域
消息流概述
ESQL 概述
消息建模
相关任务
使用消息体内容
设计消息流
定义消息流内容
管理 ESQL 文件
相关参考
MIME 标准头字段
Compute 节点
Database 节点
Filter 节点
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ac30000_