XML 和 Soap
- SOAP代表简单对象访问协议
- SOAP是一种应用程序通信协议
- SOAP是一种发送和接收消息的格式
- SOAP是独立于平台的
- SOAP是基于XML的
- SOAP是W3C推荐的
SOAP 是什么?
web应用程序能够通过Internet进行通信是很重要的。
应用程序之间通信的最佳方式是通过HTTP,因为所有Internet浏览器和服务器都支持HTTP。创建SOAP就是为了实现这一点。
SOAP提供了一种在不同操作系统上运行的应用程序之间进行通信的方法,这些应用程序使用不同的技术和编程语言。
SOAP构建块
SOAP消息是包含以下元素的普通XML文档:
- 将XML文档标识为SOAP消息的信封元素
- 包含头信息的头元素
- 包含调用和响应信息的主体元素
- 包含错误和状态信息的故障元素
以上所有元素都在SOAP信封的默认命名空间中声明:
http://www.w3.org/2003/05/soap-envelope/
SOAP编码和数据类型的默认命名空间为:
http://www.w3.org/2003/05/soap-encoding
语法规则
以下是一些重要的语法规则:
- SOAP消息必须使用XML进行编码
- SOAP消息必须使用SOAP信封命名空间
- SOAP消息不能包含DTD引用
- SOAP消息不能包含XML处理指令
骨架SOAP消息
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
...
</soap:Header>
<soap:Body>
...
<soap:Fault>
...
</soap:Fault>
</soap:Body>
</soap:Envelope>
SOAP信封元素
所需的SOAP信封元素是SOAP消息的根元素。此元素将XML文档定义为SOAP消息。
实例
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
xmlns:soap 命名空间
注意 xmlns:soap 上面实例中的命名空间。它的值始终是: "http://www.w3.org/2003/05/soap-envelope/".
命名空间将信封定义为SOAP信封。
如果使用不同的名称空间,应用程序将生成错误并丢弃消息。
默认编码样式属性
encodingStyle 属性用于定义文档中使用的数据类型。此属性可能出现在任何SOAP元素上,并应用于该元素的内容和所有子元素。
SOAP消息没有默认编码。
语法
soap:encodingStyle="URI"
实例
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
...
Message information goes here
...
</soap:Envelope>
SOAP 标头元素
可选的SOAP 标头元素包含有关SOAP消息的特定于应用程序的信息(如身份验证、支付等)。
如果存在标头元素,则它必须是信封元素的第一个子元素。
注释: 标头元素的所有直接子元素都必须是命名空间限定的。.
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3ccoo.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
上面的实例包含一个带有"Trans"元素的头、一个值为1的"mustUnderstand" 属性和一个值为234的属性。
SOAP在默认名称空间中定义了三个属性。这些属性是:mustUnderstand、actor和encodingStyle。
SOAP头中定义的属性定义了收件人应该如何处理SOAP消息。
必须理解属性
mustUnderstand 属性可用于指示收件人处理的头条目是强制的还是可选的。
如果将mustUnderstand="1"添加到头元素的子元素中,则表示处理标头的接收器必须识别该元素。如果接收器不识别该元素,则在处理标头时将失败。
语法
soap:mustUnderstand="0|1"
实例
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3ccoo.com/transaction/"
soap:mustUnderstand="1">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
参与者属性
通过沿着消息路径传递不同的端点,SOAP消息可以从发送方传递到接收方。然而,并非SOAP消息的所有部分都可以用于最终端点,相反,它可以用于消息路径上的一个或多个端点。
actor 属性用于将Header元素寻址到特定端点。
语法
soap:actor="URI"
实例
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Header>
<m:Trans xmlns:m="https://www.w3ccoo.com/transaction/"
soap:actor="https://www.w3ccoo.com/code/">234
</m:Trans>
</soap:Header>
...
...
</soap:Envelope>
encodingStyle 默认编码样式属性
encodingStyle 属性用于定义文档中使用的数据类型。这个属性可能出现在任何SOAP元素上,它将应用于该元素的内容和所有子元素。
SOAP消息没有默认编码。
语法
soap:encodingStyle="URI"
SOAP Body 元素
必需的 SOAP Body 元素包含用于消息最终端点的实际SOAP消息。
SOAP Body 元素的直接子元素可以是命名空间限定的。
实例
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPrice xmlns:m="https://www.w3ccoo.com/prices">
<m:Item>Apples</m:Item>
</m:GetPrice>
</soap:Body>
</soap:Envelope>
上面的例子要求苹果的价格。请注意,上面的m:GetPrice和Item元素是特定于应用程序的元素。它们不是SOAP名称空间的一部分。
SOAP响应可能如下所示:
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body>
<m:GetPriceResponse xmlns:m="https://www.w3ccoo.com/prices">
<m:Price>1.90</m:Price>
</m:GetPriceResponse>
</soap:Body>
</soap:Envelope>
SOAP Fault 元素
可选的 SOAP Fault元素用于指示错误消息。
SOAP Fault 元素保存SOAP消息的错误和状态信息。
如果存在故障元素,则该故障元素必须显示为车身元件的子元素。故障元素只能在SOAP消息中出现一次。
SOAP Fault 元素包含以下子元素:
子元素 | 描述 |
---|---|
<faultcode> | 用于识别故障的代码 |
<faultstring> | 对故障的可读性解释 |
<faultactor> | 是谁导致故障发生的信息 |
<detail> |
保存与Body元素相关的特定于应用程序的错误信息 |
SOAP 故障代码
描述故障时,必须在faultcode元素中使用以下定义的faultcode值:
Error | 描述 |
---|---|
VersionMismatch | 为SOAP信封元素找到无效的命名空间 |
MustUnderstand | 头元素的立即子元素the mustUnderstand属性设置为"1"时未被理解 |
Client | 邮件格式不正确或包含不正确的信息 |
Server | 服务器出现问题,因此消息无法继续 |
HTTP协议
HTTP通过TCP/IP进行通信。HTTP客户端使用TCP连接到HTTP服务器。建立连接后,客户端可以向服务器发送HTTP请求消息:
POST /item HTTP/1.1
Host: 189.123.255.239
Content-Type: text/plain
Content-Length: 200
然后服务器处理请求并将HTTP响应发送回客户端。响应包含指示请求状态的状态代码:
200 OK
Content-Type: text/plain
Content-Length: 200
在上面的例子中,服务器返回的状态码是200。这是HTTP的标准成功代码。
如果服务器无法解码请求,它可能会返回如下内容:
400 Bad Request
Content-Length: 0
SOAP绑定
SOAP规范定义了SOAP消息的结构,而不是它们的交换方式。这个缺口被所谓的"SOAP Bindings"所填补。SOAP绑定是允许使用传输协议有效交换SOAP消息的机制。
大多数SOAP实现都为常见的传输协议(如HTTP或SMTP)提供绑定。
HTTP是同步的,应用广泛。soaphttp请求至少指定两个HTTP头:内容类型和内容长度。
SMTP是异步的,用于最后手段或特殊情况。
SOAP的Java实现通常为JMS(Java消息传递系统)协议提供特定的绑定。
Content-Type
SOAP请求和响应的Content-Type头定义消息的MIME类型和用于请求或响应的XML主体的字符编码(可选)。
语法
Content-Type: MIMEType; charset=character-encoding
实例
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length
SOAP请求和响应的Content-Length头指定请求或响应主体中的字节数。
语法
Content-Length: bytes
示例
POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250
SOAP 实例
在下面的实例中,GetStockPrice请求被发送到服务器。请求有一个StockName参数和一个Price参数,该参数将在响应中返回。函数的命名空间在"http://www.example.org/stock"中定义.
SOAP 请求:
POST /InStock HTTP/1.1
Host: www.example.org
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPrice>
<m:StockName>IBM</m:StockName>
</m:GetStockPrice>
</soap:Body>
</soap:Envelope>
SOAP 响应:
HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: nnn
<?xml version="1.0"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope/"
soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
<soap:Body xmlns:m="http://www.example.org/stock">
<m:GetStockPriceResponse>
<m:Price>34.5</m:Price>
</m:GetStockPriceResponse>
</soap:Body>
</soap:Envelope>