XML SOAP

创建于 2024-12-03 / 30
字体: [默认] [大] [更大]

  • 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>

0 人点赞过