SOAP协议本身只定义了基于XML的消息结构与处理模型,它并不强制要求使用HTTP作为底层传输。因此在技术原理上,SOAP over FTP是完全可能的,只要通信双方约定好如何把SOAP信封写成文件、放到哪里、何时读取即可。这种非HTTP的传输方式常用于网络隔离、批量数据交换或遗留系统对接。

为什么SOAP可以不依赖HTTP
SOAP规范(如SOAP 1.1/1.2)将消息语义与传输协议解耦,称为“协议绑定”的灵活性。HTTP绑定最常见,是因为它提供了请求-响应语义和广泛的中间件支持;但规范并未禁止其他绑定。FTP作为文件传输协议,虽然只有异步、无内置消息确认,却足以承载静态的SOAP XML文件。只要发送方把完整的<soap:Envelope>写入一个.xml文件并PUT到FTP目录,接收方GET后解析,就完成了一次SOAP交换。
需要注意的是,使用FTP会丢失HTTP那种即时回执和错误状态码。因此SOAP over FTP一般用于离线或准实时场景,例如每日对账文件、跨安全域的数据摆渡。如果业务要求强一致和实时应答,则不应采用此方案。
发送端示例:Python生成SOAP并走FTP
下面代码演示如何构造一段SOAP 1.2报文,并通过Python标准库ftplib上传到FTP服务器。代码中所有XML特殊字符均按文本处理,未引入额外框架。
import ftplib
from xml.sax.saxutils import escape
# 构造SOAP信封字符串
soap_template = """<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
<soap:Header></soap:Header>
<soap:Body>
<GetPrice xmlns="http://ippipp.com/stock">
<Symbol>{symbol}</Symbol>
<GetPrice>
</soap:Body>
</soap:Envelope>"""
payload = soap_template.format(symbol=escape("IBM"))
# 连接FTP并上传
session = ftplib.FTP("192.168.0.1", "user", "pass")
session.cwd("/soap_inbox")
with session.storebinary("STOR msg_001.xml", payload.encode("utf-8")) as f:
pass
session.quit()
上述脚本先拼出合规的SOAP XML,再调用storebinary方法以二进制形式写入FTP目录。实际生产中应加入文件名唯一性、重试与日志。由于FTP明文传输,若跨公网务必改用FTPS或SFTP,并配合报文级签名。
接收端如何处理落地的SOAP文件
接收方通常启动一个守护进程,定时扫描FTP上的入站目录,或者利用FTP服务器的事件通知(部分服务器支持)。取到文件后,用XML解析器校验soap:Envelope结构,提取soap:Body中的业务节点,调用本地服务,并将处理结果再写成另一个SOAP文件放回出站目录。
这种“文件式”交互虽然原始,但容错性好:某一方宕机,文件仍在,恢复后仍可处理。缺点是无法直接用WS-Addressing做回调,需要业务层自己定义关联ID。下面的Java片段展示如何解析落地的SOAP文件。
import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class FtpSoapReceiver {
public void process(File soapFile) throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(soapFile);
// 检查根元素是否为 soap:Envelope
String root = doc.getDocumentElement().getLocalName();
if (!"Envelope".equals(root)) {
throw new IllegalArgumentException("not a soap envelope");
}
// 后续提取Body并路由到业务方法
}
}
与HTTP绑定的对比及选型建议
为直观理解差异,下表列出关键维度。HTTP绑定适合在线服务,FTP绑定适合脱机批量。
| 维度 | SOAP over HTTP | SOAP over FTP |
|---|---|---|
| 交互模式 | 同步请求响应 | 异步文件交换 |
| 传输安全 | TLS易集成 | 需FTPS/SFTP |
| 部署复杂度 | 需Web服务器 | 仅需FTP服务 |
| 适用场景 | 实时API | 跨域摆渡、批处理 |
若你的系统处于隔离网闸两侧,且允许一定延迟,SOAP over FTP是低成本打通XML业务的务实选择。反之,若需要事务回滚和即时异常,请保留HTTP或采用消息队列绑定。
常见误区提醒
有人误以为SOAP必须通过WebService框架(如CXF、Axis)才可发送,其实框架只是帮你做了HTTP绑定和序列化;脱离框架手动写文件同样合规。另一个误区是认为FTP不支持XML特殊字符,实际上只要以二进制或正确编码上传,字符内容不受协议影响。
总结:SOAP over FTP在技术上可行,核心在于双方约定文件命名、目录与重试规则,它用简单性换取了实时性,是特定环境下的有效非HTTP传输示例。
SOAPFTPnon_HTTP_transport修改时间:2026-08-06 21:33:30