SoapUI怎么发送带附件的XML请求 MTOM/SWA

SoapUI发送带附件的XML请求需区分MTOM(推荐,自动处理)和SWA(手动构造MIME),核心是正确设置Content-Type、边界符、Content-ID及xop:Include或cid引用。

SoapUI 发送带附件的 XML 请求(支持 MTOM 或 SWA)需要手动构造符合规范的消息结构,不能仅靠普通表单上传。核心在于正确设置请求的 Content-Type(如 multipart/related)、添加附件部分、并在 SOAP Body 中用 xop:Include 引用二进制内容。以下是具体操作方式:

确认协议支持并选择合适方式

MTOM 和 SWA 都是 SOAP 附件传输标准,但 SoapUI 原生对 MTOM 支持更完善(尤其 Pro 版),而 SWA(SOAP with Attachments)较老旧,需严格遵循 MIME 封装格式。建议优先使用 MTOM,除非服务端明确要求 SWA。

  • MTOM:基于 XOP(XML-binary Optimized Packaging),SOAP Body 内保留 XML 结构,二进制内容单独作为 multipart part 存放,用 cid: 引用
  • SWA:整个消息为 multipart/related,SOAP XML 本身是第一个 part(type="text/xml"),附件是后续 part(如 type="application/octet-stream"),通过 Content-ID 关联

用 MTOM 方式发送(推荐)

SoapUI(开源版或 Pro)可自动处理 MTOM,前提是 WSDL 正确声明了 xs:base64Binary 参数并标注 xmime:expectedContentTypes,且请求使用「Raw」模式或启用 MTOM 选项。

  • 在请求编辑区右键 → Select Request Style → MTOM/XOP(若灰显,说明 WSDL 未正确定义附件参数)
  • 将附件字段(如 )的值设为文件路径,格式为:file://C:/path/to/file.jpg(注意双斜杠和绝对路径)
  • 确保项目设置中启用了 MTOM:Project → Properties → Enable MTOM 打勾
  • 发送前检查 Raw 标签页,可见自动生成的 Content-Type: multipart/related; type="application/xop+xml" 及多个 parts

手动构造 SWA 请求(无 WSDL 或需兼容旧服务)

当无法启用 MTOM 或服务只认 SWA 时,需切换到 Raw 模式,手工拼接 MIME 消息。关键点:边界符一致、Content-ID 匹配、SOAP part 的 Content-Type 为 text/xml,附件 part 的 Content-Type 和 Content-ID 要与 XML 中引用一致。

  • 将请求类型改为 Raw,Content-Type 设为:multipart/related; type="text/xml"; start=""
  • 按 MIME 格式编写(示例含一个 JPG 附件):

    --xyz123
    Content-Type: text/xml; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    Content-ID:



      
        
          test.jpg
          
        

      

    --xyz123
    Content-Type: image/jpeg
    Content-Transfer-Encoding: binary
    Content-ID:

    [二进制数据粘贴处 —— SoapUI 不支持直接粘贴二进制,需用脚本或 Base64 编码后用 text/plain + base64]
    --xyz123--
  • 实际中更常用 Base64 编码附件再内联(非真正 SWA,但服务端常兼容):把文件 Base64 编码后填入 ...,此时 Content-Type 保持 text/xml 即可

验证与调试技巧

发送后务必检查 Raw 请求和响应,确认 multipart 结构完整、CID 引用匹配、附件大小未被截断。常见失败原因包括边界符缺失、Content-ID 多余空格、文件路径错误或编码不匹配。

  • 启用 SoapUI 日志:File → Preferences → Log Viewer → 勾选 HTTP Logs,查看真实发出的字节流
  • 用外部工具(如 Postman 或 curl)对比成功请求的 raw 格式,反向调整 SoapUI 的手工内容
  • 如果服务返回 “Invalid MIME part” 或 “Content-ID not found”,重点检查 Content-ID 的尖括号是否完整(必须是 ,不是 xxx