soap消息如何传送附件

来源:互联网 发布:windows 查看共享目录 编辑:程序博客网 时间:2024/05/24 07:16

soap消息如何传送附件


项目中使用了soap接口实现远程通讯,有文件传送的需求。常见的解决方案如下:

  • 文件内容读出后,使用base64编码传输
  • 通过MTOM方式,以消息附件发送
  • 如果文件内容过大,可以先通过soap消息传递文件信息,服务端再使用sftp等文件协议主动下载(此方式成本较高,要求客户端提供文件服务)

本文介绍一下第二种方式的处理。
MTOM(Message Transmission Optimization Mechanism),消息传输优化机制,允许将消息中包含的大型数据元素外部化,并将其作为无任何特殊编码的二进制数据随消息一起传送。


*消息定义*

在编写wsdl时,消息结构字段按照如下方式定义:

<element name="Attachment">    <complexType>        <sequence>            <element name="filename" type="xsd:string"/>            <element name="content" type="xsd:base64Binary"/>        </sequence>    </complexType></element>

为了将其中的content字段转换成附件形式,需要对将该字段按照如下方式定义:

<element name="content" type="xsd:base64Binary" xmime:expectedContentTypes="application/octet-stream"/>

在schema中增加如下内容:

xmlns:xmime="http://www.w3.org/2005/05/xmlmime"

此后,使用cxf发布api时,content字段会被解析为DataHandler类型

@XmlTypepublic class Attachment {  private String filename;  @XmlMimeType("application/octet-stream")  private DataHandler content;  public String getFilename() { return filename; }  public void setFilename(String filename) { this.filename = filename; }  public DataHandler getContent() { return content; }  public void setContent(DataHandler content) { this.content = content;}}

*MTOM支持*

服务端需要提供支持MTOM的服务:

Endpoint ep = Endpoint.publish("http://localhost/submit", new Submit());SOAPBinding binding = (SOAPBinding) ep.getBinding();binding.setMTOMEnabled(true);

本人项目上使用了mule ESB统一发布服务,mule ESB提供了cxf插件用于发布服务,开启MTOM支持需要在cxf插件中增加mtom-enabled=”true” 属性。


*附件传送*

客户端

Attachment attachment = new Attachement();attachment.setFilename("only4Test.zip");attachment.setContent(new DataHandler(new FileDataSource("/home/test/only4Test.zip")));client.someMethod(attachment);

服务端

DataHandler fileHandler = attachment.getContent();InputStream inputStream = fileHandler.getInputStream();...
原创粉丝点击