### SOAP ABC

摘要：SOAP 是一个基于 XML 的通信协议，在该协议下，软件组件和应用程序能够通过标准的 HTTP 协议通信。
内容：
SOAP 是一个基于 XML 的通信协议，在该协议下，软件组件和应用程序能够通过标准的 HTTP 协议通信。
谁起草了 SOAP?
SOAP 由 UserLand, Ariba, Commerce One, Compaq, Developmentor, HP, IBM, IONA, Lotus, Microsoft, 和 SAP 共同起草.
为什么 SOAP?
在 internet 环境下应用开发的一个重要方面是：应用之间应该能够相互通信。传统的方法是在分布式对象比如：DCOM CORBA 之间进行相互的远程过程调用，但在这种场合下 HTTP 协议毫无用武之地，因此在 internet 环境下的远程过程调用不是一件容易的事情，在 internet 上使用 RPC 还存在安全的问题，防火墙和代理服务器还很有可能阻塞这种类型的数据传输。
使用 HTTP 是一种很好的主意，因为 HTTP 协议得到了所有的浏览器和服务器的支持，SOAP 的宗旨就在于发挥 HTTP 和 XML 优点，从而完成在应用之间的交互。
SOAP 1.1 和 W3C
起草 SOAP 的各个大公司在 2000 年 5 月份向 W3C 提交 SOAP，目前 SOAP 是 W3C 的 note。
SOAP 方方面面:
SOAP 是一个轻量级的通讯协议（lightweight communication protocol ）
SOAP 用于应用和应用之间的通讯
使用 SOAP 的应用通过 HTTP 通讯
SOAP 独立于任何组件技术
SOAP 独立于编程语言
SOAP 基于 XML
SOAP 简单并且具有良好的扩展性
SOAP 已向 W3C 提交
SOAP 有望成为 W3C 的标准
微软和 SOAP
SOAP 是微软的 WINDOWS DNA 2000 体系结构中的关键技术。
SOAP 组成
一个 SOAP 消息是一个普通的 XML 文档，该文档包含如下的元素：
SOAP envelope,定义消息的内容
SOAP header (可选), 包含头信息
SOAP body,包含所有的调用和会应信息
SOAP 的一个例子
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<GetPrice>
<Item>Apples</Item>
</GetPrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
上面的例子是一个简单的 XML 文档，要求得到苹果的价格信息。
SOAP 名域
SOAP envelope 元素的缺省名域：
http://schemas.xmlsoap.org/soap/envelope/
SOAP encoding and data types 的缺省名域：
http://schemas.xmlsoap.org/soap/encoding/
部分重要的语法规则
SOAP 消息必须用 XML 编码
SOAP 消息必须有一个 SOAP Envelope
SOAP 消息可以又一个 SOAP header
SOAP 消息必须有一个 SOAP Body
SOAP 消息必须使用 SOAP Envelope 名域
SOAP 消息必须使用 SOAP Encoding 名域
SOAP 消息 不能包含 DTD 引用
SOAP 消息不能有 XML 处理指令
以下是一个 SOAP 的例子，该 SOAP 消息被封装在一个 HTTP 请求中，GetStockPrice 请求被发送到 server。该请求具有一个 StockName 参数，返回一个相应的 StockPrice。请注意这里的自定义名域，该名域规定了特殊的元素所对应的服务，只有这样通信的双方才能理解对方的要求。
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<xmlns:m="http://www.stock.org/stock" />
<m:GetStockPrice>
<StockName>IBM</StockName>
</m:GetStockPrice>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
封装在 HTTP 中的 SOAP 应答
<SOAP-ENV:Envelope>
<SOAP-ENV:Body>
<xmlns:m="http://www.stock.org/stock" />
<m:GetStockPriceResponse>
<Price>34.5</Price>
</m:GetStockPriceResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
SOAP 的出错信息
SOAP 的出错信息必须包含在 Fault 元素当中，而 Fault 元素如果出现，只能在 body 元素中出现，并只出现一次。
它的子元素如下表：
Sub Element Description
<faultcode> A code identifying the error
<faultstring> The error as a string
<faultactor> Who caused the error
<detail> Specific error information