带附件的SOAP消息(SOAP with Attachments,缩写SwA 或MIME for Web Services)是指使用Web服务,通过SOAP和MIME,主要使用HTTP协议,发送和接收邮件的方法。
SOAP消息有时需要和不同类型的附件一同传输,可能是一个图像,或是一个二进制的文档,有时文件还很大。这种情况下,如果通过SOAP协议传送,传统的方式需要将附件转换为base64编码并插入到SOAP信封中,这样既不方便也造成效率问题。带附件的SOAP消息(SwA)提供了一种快捷的方式。 带附件的SOAP消息的HTTP请求消息(或应答消息)使用了Multipart/Related媒体类型发送,SOAP信封作为一个部分,附件作为其余的部分。在SOAP消息的Header条目或Body条目的子条目中都可以使用href属引用附件的URI。带附件的SOAP消息并非是一个新的规范,而是一个使用现有的SOAP和MIME手段,能够通过Web服务调用传输文件的一种机制。
soap报文最外层元素为envelope,即soap信封。Envelope之下有2个子元素:Header和body。其中,body是soap报文的主要数据载体,该元素时必须的,用来存放交换的信息。
在web service的实现中,经常需要在soap报文中携带各种类型的附件一起传输(可能是文本文件、二进制文件或者是图片等)。然而,soap是基于xml的文本协议,只能使用字符组成的文本来表示数据,无法再报文中直接使用其他格式的附件。因此,如何将soap报文同其他格式的附件组织在一起进行传输便成为一个需要解决的重要问题。
Base64 编码的二进制 SOAP 附件
为了简单和通用性,XML 被设计成了以文本的格式来表示数据。使用 SOAP 进行传递的数据首先被序列化,也就是将数据转换成字符串在 XML 文档中传送。在目的地,字符串再被反序列化,即再被转换成表示原来的值的数据类型。把二进制数据放入 SOAP 报文的最简单的方法,就是使用 Base64 编码的方式对其进行编码,以实现数据的序列化和反序列化。
Base64 是一种很常见的编码规范,其作用是将二进制序列转换为可读的 ASCII 字符序列,常用在需用通过文本协议传输二进制数据的情况下,例如 HTTP 和 SMTP 协议。Base64 编码基本原理是把每三个 8bit 的字节转换为四个 6bit 的字节,然后把 6bit 再添两位高位 0,组成四个 8bit 的字节,不满四个字节的以 '=' 填充。因为 Base64 将输入的数据编码成只含有 {'A'-'Z', 'a'-'z', '0'-'9', '+', '/'} 这 64 个字符的串,所以称之为 Base64 编码。可以看出,转换后的字符串理论上将要比原来的长 1/3。
尽管使用 Base64 编码能够将二进制数据放入 SOAP 报文中进行传输,然而,其效率非常低下。根据前面对 Base64 编码原理的分析,采用 Base64 编码将会引入 33% 的冗余尺寸,从而使 SOAP 消息变大;另外,对二进制数据进行编码和解码将造成较大的时间开销,严重影响应用程序的性能。鉴于这些问题,2000 年 12 月,W3C 组织推出了 SOAP 附件标准:SOAP Messages with Attachments (SwA) 规范,将 SOAP 附件置于 SOAP 主体之外,基于 MIME 技术实现了 SOAP 报文同 SOAP 附件的封装。
MIME消息由消息头和消息体两大部分组成。
SOAP附件标准SwA只针对SOAP1.1版本,其MIME类型为Multipart/Related,表示文档的多个部分是相关的。SOAP消息主体位于Multipart/Related结构的第一段,其content-type的值为text/xml,其余的为MIME段的soap附件。
SOAP 消息包
SOAP 消息包包含 XML 格式的主 SOAP 消息以及 SOAP 信封中未定义但与消息有关的任意数据格式(例如 gif、jpg 和 xml 等)的其它实体。
如 图 1所示,SOAP 消息包是用 MIME 的 Multipart/related 媒体类型构建的,每个部件都嵌入 MIME 边界(在 Context-Type 报头中定义)。每个 MIME 部件都有报头信息比如 Context-Type (它指定嵌入这个 MIME 部件的数据的类型)、 Content Transfer-encoding (指定用于这个 MIME 部件的编码)、 Content-ID 和/或 Content-Location (作为从 MIME 包的任何地方引用这些内容的标识符)。MIME 消息的根部件包含 SOAP 信封, Content-Type 被设置为 text/xml。
SOAP 消息由 MIME 头,一个封装主体 SOAP1.1 消息的 MIME 段和一个或多个封装 SOAP 附件的 MIME 段三部分组成。其中每部分以 MIME 边界分隔,Context-Type 用于指定 MIME 段的数据的类型、Content Transfer-encoding 用于指定用于 MIME 段的编码方式、Content-ID 或者 Content-Location 用于作为该 MIME 部件的标识符。
一个基于 SwA 的 SOAP 报文
POST /test HTTP/1.0
Content-Type: Multipart/Related; boundary=MIME_boundary; type=text/xml
Content-Length: XXXX
SOAPAction: http://www.soapattach.com/test
--MIME_boundary
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: 8bit
<?xml version='1.0'?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<Car name="myCar">
<Picture href = “cid:benz@pictures.soapattach.com”/>
</Car>
</soap:Body>
</soap:Envelope>
--MIME_boundary
Content-Type: image/jpeg
Content-Transfer-Encoding: binary
Content-ID: <benz@pictures.soapattach.com>
...binary JPEG image...
--MIME_boundary--
分享到:
相关推荐
httpclient带附件和不带件的例子以及SOAP请求的例子,该压缩包解压后是一个java web工程,直接引入到eclipst下就可以。要在Build Path——Configure Build Path中添加tomcat的lib包。
在上传附件的情况下,请求体通常包含了文件内容。 1. **创建HTTP请求**: 可以使用`System.Net.HttpWebRequest`类来创建HTTP请求。首先,你需要实例化这个类,并设置其`RequestUri`属性为服务器的URL。例如: ```...
总的来说,易语言获取论坛帖子和附件的技术核心包括网络请求、HTML解析、数据过滤和文件下载。掌握这些技能,开发者不仅可以用于爬取论坛信息,还可以应用到其他需要从网页抓取数据的场景,如新闻聚合、市场分析等。...
而POST请求用于提交数据,数据包含在请求体中,适合传递大量或敏感信息。在C#的Web开发中,`HttpClient`是实现这些功能的关键类。通过理解和熟练掌握GET和POST请求的使用,可以更高效地开发和维护Web应用程序。
"jsp,java,邮件发送器(带附件)" 这个标题指出,我们关注的是一个使用Java和JSP技术实现的电子邮件发送系统,具备发送附件的功能。这意味着该系统能够处理不仅仅是纯文本内容,还支持包括文档、图片、音频等各种...
因此,如果需要发送带有附件的邮件,一般会使用UTL_SMTP,这是一个低级别的接口,可以构建复杂的邮件结构,包括多部分MIME消息,适合添加附件。或者,更常见的方式是通过调用Java存储过程,利用JavaMail API的功能。...
首先,你需要设置好请求的URL,通常是API的入口地址,加上获取附件的特定参数。例如,可能需要提供流程实例ID或附件ID来精确定位附件。然后,设置请求头,包括必要的认证信息,如OAuth令牌或者基础认证的用户名和...
- **添加注释或附件**:如果需要,可以在请求中添加额外的注释或附件以提供更多的背景信息。 - **重新提交审批**:完成所有必要的修改后,再次提交请求进行审批。这一步骤是确保修改后的请求符合组织的政策和流程...
以下是一个简单的发送邮件带附件的Java代码示例: ```java ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1); ExchangeCredentials credentials = new WebCredentials(...
5. **回复处理流程**:当玩家发送带有附件的消息时,服务器会处理请求,将附件存储,然后构造回复消息,包含附件的引用或实际内容。回复消息会通过网络消息系统发送回客户端。 6. **并发与性能优化**:在大规模的...
本案例聚焦于利用企业微信的接口调用来发送带有附件的普通电子邮件。以下是对这个主题的详细阐述: 一、企业微信接口调用 企业微信开放了API接口,开发者可以通过这些接口与企业微信的服务器进行通信,实现如消息推...
上传过程中,框架可能支持多种方式,如Base64编码直接嵌入HTTP请求体,或者以Multipart形式作为文件附件。对于表单上传,数据通常以键值对形式与图片一同发送,这要求框架能处理复杂的请求结构。 OkHttp是Square...
Roundcube Webmail是一款基于Web的邮件客户端程序,它提供了类似桌面邮件客户端的功能,如地址簿、文件夹操作、消息搜索等。Roundcube采用PHP编写,并依赖于MySQL数据库存储数据。其简洁的界面和丰富的功能使其成为...
1. **定义服务接口**:创建一个WSDL(Web Services Description Language)文件,它描述了服务的接口、操作和消息格式。这个文件是公开的,可以让客户端知道如何与服务进行交互。 2. **实现服务端**:根据WSDL文件...
在这个“带附件上传功能的kindeditor编辑器”项目中,我们看到作者对原版KindEditor进行了扩展,增加了本地文件和网络文件上传的能力。这是一项非常实用的功能,尤其对于需要用户提交文档、图片或者其他媒体文件的...
在C++编程中,发送带有附件的电子邮件是一项常见的任务,特别是在自动化系统或服务中。C++本身并不直接支持SMTP(简单邮件传输协议)用于发送邮件,但我们可以利用库或者第三方API来实现这一功能。本教程将详细介绍...
POST请求的数据包含在请求体中,对数据量无明显限制,且数据对用户不可见。 在C#中,我们可以使用`System.Net.Http`命名空间中的HttpClient类来处理HTTP请求。以下是如何使用HttpClient发送GET和POST请求的示例: ...
`END_OF_BODY`表示消息体结束等。 #### 操作注意事项 在使用`UTL_HTTP`时需要注意几个关键点: 1. **安全认证**:如果目标站点采用HTTPS,则需要配置Oracle钱包。 2. **ACL权限**:必须为Oracle数据库设置适当的...
这个例子中,我们创建了一个JSON对象,包含了消息的目标用户、消息类型和内容,然后通过POST请求发送到企业微信服务器。 以上就是使用Java实现企业微信消息推送的主要步骤和知识点,实际开发中还需要根据具体业务...
GetUrl.dll 很可能是程序中负责下载链接获取和管理的核心组件,可能包含了网络请求和数据解析的函数。 "运行程序.exe" 是这个工具的主执行文件,用户通过双击它来启动附件精灵。这个程序可能会调用上述的dll文件,...