You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Domino Java Agent如何解码文档上下文Request_Content中的POST请求

Domino 9.0.1处理multipart/form-data请求的方案

一、直接解码Request_Content的方法

Domino没有内置multipart解码工具,可借助Java标准库的javax.mail.internet.MimeMultipart处理,步骤如下:

  • 先拼接分段的Request_Content_000...字段(如果存在)成完整字节流;
  • 用MimeMultipart解析流,区分普通字段和附件。

代码示例:

Session session = getSession();
AgentContext agentContext = session.getAgentContext();
Document documentContext = agentContext.getDocumentContext();

// 拼接所有Request_Content分段
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int partNum = 0;
while (true) {
    String itemName = partNum == 0 ? "Request_Content" : "Request_Content_" + String.format("%03d", partNum);
    if (!documentContext.hasItem(itemName)) break;
    byte[] partBytes = (byte[]) documentContext.getItemValue(itemName).elementAt(0);
    baos.write(partBytes);
    partNum++;
}
byte[] fullContent = baos.toByteArray();

// 解析multipart数据
DataSource ds = new ByteArrayDataSource(fullContent, "multipart/form-data");
MimeMultipart multipart = new MimeMultipart(ds);

for (int i = 0; i < multipart.getCount(); i++) {
    BodyPart part = multipart.getBodyPart(i);
    // 处理普通字段
    if (part.isMimeType("text/plain") || part.isMimeType("text/*")) {
        String fieldName = "";
        // 从Content-Disposition提取字段名
        String[] dispParts = part.getHeader("Content-Disposition")[0].split(";");
        for (String dispPart : dispParts) {
            if (dispPart.trim().startsWith("name=")) {
                fieldName = dispPart.trim().substring(5).replace("\"", "");
                break;
            }
        }
        String fieldValue = part.getContent().toString();
        // 这里处理字段值
    } 
    // 处理附件
    else {
        String fileName = part.getFileName();
        InputStream attachmentStream = part.getInputStream();
        // 示例:保存附件到新文档
        Database db = session.getCurrentDatabase();
        Document doc = db.createDocument();
        doc.replaceItemValue("Form", "AttachmentForm");
        doc.createAttachment(fileName, attachmentStream);
        doc.save();
    }
}

Domino 9.0.1自带JavaMail相关jar,无需额外引入。

二、Servlet/HttpServlet方案

Domino 9.0.1支持Servlet引擎,用Servlet处理HTTP请求更原生,直接通过HttpServletRequest的getParts()解析multipart数据,代码更简洁:

示例片段:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    Collection<Part> parts = request.getParts();
    for (Part part : parts) {
        String fieldName = part.getName();
        // 普通字段
        if (part.getContentType() == null) {
            String fieldValue = new String(IOUtils.toByteArray(part.getInputStream()), "UTF-8");
            // 处理字段
        } 
        // 附件
        else {
            String fileName = part.getSubmittedFileName();
            InputStream in = part.getInputStream();
            // 处理附件
        }
    }
}

缺点是需要在Domino中配置Servlet映射,部署比Agent繁琐。

三、xAgent方案

xAgent是可通过URL直接调用的特殊Java Agent,核心处理逻辑和普通Agent一致,还是用MimeMultipart解码Request_Content。但xAgent更适合做HTTP接口,能直接返回自定义响应(JSON/XML等),无需额外配置Servlet。

总结

  • 快速实现选Java Agent+MimeMultipart;
  • 长期Web服务选Servlet,符合标准开发模式;
  • 轻量HTTP接口选xAgent,兼顾Agent的便捷和接口的灵活性。

内容的提问来源于stack exchange,提问作者Adam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:01:14