最新的Web开发教程
 

XML Soap


  • SOAP代表简单对象访问P rotocol
  • SOAP是一种应用程序通信协议
  • SOAP是用于发送和接收消息的格式
  • SOAP是独立于平台
  • SOAP是基于XML的
  • SOAP是一种W3C推荐

为什么SOAP?

Web应用程序,以便能够在互联网上进行通信是非常重要的。

应用程序之间进行沟通的最佳方式是通过HTTP,因为HTTP被所有的互联网浏览器和服务器的支持。 SOAP是为了做到这一点。

SOAP提供一种在不同的操作系统上运行,具有不同的技术和编程语言的应用程序之间进行通信。


SOAP构建模块

SOAP消息是包含以下元素一个普通的XML文档:

  • 标识XML文档作为SOAP消息的Envelope元素
  • 包含的头部信息Header元素
  • 包含呼叫和响应信息的主体元素
  • 包含错误的信息和状态信息的故障元

所有元素都在SOAP信封的默认命名空间中声明:

http://www.w3.org/2003/05/soap-envelope/

和SOAP编码和数据类型的默认命名空间是:

http://www.w3.org/2003/05/soap-encoding


语法规则

以下是一些重要的语法规则:

  • SOAP消息必须用XML来编码
  • SOAP消息必须使用SOAP信封命名空间
  • 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:在上面的例子皂命名空间。 它应该总是价值: "http://www.w3.org/2003/05/soap-envelope/"

该命名空间定义信封为SOAP信封。

如果使用了不同的命名空间,应用程序生成一个错误并丢弃该消息。


encodingStyle属性

所述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 Header元素包含应用程序特定的信息(like authentication, payment, etc)有关SOAP消息。

如果标题元素是存在的,它必须是Envelope元素的第一个子元素。

Note: Header元素的所有直接子元素必须是合格的命名空间。

<?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="http://www.w3ii.com/transaction/"
  soap:mustUnderstand="1">234
  </m:Trans>
</soap:Header>
...
...
</soap:Envelope>

上面的例子中包含一个首标"Trans"元素, "mustUnderstand"为1的值的属性,和234的值。

SOAP定义了默认的命名空间三种属性。 这些属性是:mustUnderstand属性,演员,encodingStyle的。

在SOAP Header中定义的属性定义收件人应如何处理SOAP消息。


mustUnderstand属性

在SOAP mustUnderstand属性可以被用于指示一个头项是强制的还是可选的接收方处理。

如果添加的mustUnderstand =“1”Header元素的子元素则表明接收处理页眉必须认识到的元素。 如果接收机不能识别元件处理所述报头时,它都将失败。

句法

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="http://www.w3ii.com/transaction/"
  soap:mustUnderstand="1">234
  </m:Trans>
</soap:Header>
...
...
</soap:Envelope>

actor属性

SOAP消息可以通过不同的端点沿着消息路径从发送到接收机。 然而,并非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="http://www.w3ii.com/transaction/"
  soap:actor="http://www.w3ii.com/appml/">234
  </m:Trans>
</soap:Header>
...
...
</soap:Envelope>

encodingStyle属性

所述encodingStyle属性用于定义文档中使用的数据类型。 这个属性可能会出现在任何SOAP元素,它将适用于该元素的内容和所有子元素。

SOAP消息没有默认的编码。

句法

soap:encodingStyle="URI"

SOAP体元素

所需的SOAP Body元素包含用于该消息的最终端点的实际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:GetPrice xmlns:m="http://www.w3ii.com/prices">
    <m:Item>Apples</m:Item>
  </m:GetPrice>
</soap:Body>

</soap:Envelope>

上面的例子请求苹果的价格。 需要注意的是第m:上述GetPrice和项目元素是应用程序特定的元件。 它们不是在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="http://www.w3ii.com/prices">
    <m:Price>1.90</m:Price>
  </m:GetPriceResponse>
</soap:Body>

</soap:Envelope>


SOAP错误元素

可选的SOAP故障元件用于指示错误消息。

SOAP错误元素包含SOAP消息的错误和状态信息。

如果故障元素是存在的,它必须是Body元素的子元素。 的故障元素只能在SOAP消息中出现一次。

SOAP错误元素具有以下子元素:

子元素 描述
<faultcode> 一种用于识别故障代码
<faultstring> 故障的可读解释
<faultactor> 是谁造成的故障的信息
<detail>

持有相关的主体元素应用特定的错误信息

SOAP故障代码

下面定义的faultcode值必须在faultcode元素描述故障时,可以使用:

错误 描述
VersionMismatch 发现SOAP信封元素的无效命名空间
MustUnderstand Header元素的一个直接子元素,用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是同步并广泛使用。 一个SOAP HTTP请求规定至少两个HTTP头:Content-Type和Content-Length的。

SMTP是异步的,在万不得已或特定的情况下使用。

SOAP的Java实现通常提供特定的JMS绑定(Java Messaging System)协议。


内容类型

一个SOAP请求和响应的Content-Type头定义MIME类型消息和字符编码(optional)用于请求或响应的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: bytes

POST /item HTTP/1.1
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 250

一个SOAP实例

在下面的例子中,一个GetStockPrice请求被发送到服务器。 该请求具有StockName参数,这将在响应中返回一个价格参数。 该函数的命名空间中定义的"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>