1.    什么是SOAP

SOAP全称:简单对象访问协议(Simple Object Access Protocol),请区别与SOA的异同,SOA全称是,面向服务体系结构(Service-oriented architecture),别搞混淆。

SOAP是一种通信协议,它规定了一种以XML为信息载体进行信息交互的协议,主要用于Web服务(Web Service)中,SOAP协议在使用时,可以将其绑定到HTTP协议,或TCPUDP协议。

2.    SOAP的特点

SOAP 指简易对象访问协议

SOAP 是一种通信协议

SOAP 用于应用程序之间的通信

SOAP 是一种用于发送消息的格式

SOAP 被设计用来通过因特网进行通信

SOAP 独立于平台

SOAP 独立于语言

SOAP 基于 XML

SOAP 很简单并可扩展

SOAP 允许您绕过防火墙

SOAP 将被作为 W3C 标准来发展

 

3.    SOAP的结构及语法

3.1  SOAP消息的结构

SOAP消息就是一个普通的xml文档,SOAP格式的XML文档主要有以下几大元素:

必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息

可选的 Header 元素,包含头部信息

必需的 Body 元素,包含所有的调用和响应信息

可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

 

3.2  SOAP消息的语法规则

SOAP 消息必须用 XML 来编码

SOAP 消息必须使用 SOAP Envelope 命名空间

SOAP 消息必须使用 SOAP Encoding 命名空间

SOAP 消息不能包含 DTD 引用

SOAP 消息不能包含 XML 处理指令

 

3.3  SOAP消息结构示例

<?xml version="1.0"?>

<soap:Envelope

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

 

<soap:Header>

...

...

</soap:Header>

 

<soap:Body>

...

...

<soap:Fault>

...

...

</soap:Fault>

</soap:Body>

 

</soap:Envelope>

4.    SOAP元素讲解

4.1  Envelope元素

SOAP消息的根元素,且其命名空间始终是http://www.w3.org/2001/12/soap-envelope

如:

<?xml version="1.0"?>

<soap:Envelope

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

  ...

  Message information goes here

  ...

</soap:Envelope>

 

Envelope元素包含的属性有:encodingStyle      

encodingStyle属性:

Ø  作用:定义在文档中使用的数据类型

Ø  语法:soap:encodingStyle="这里填URI地址"

Ø  示例:

<?xml version="1.0"?>

<soap:Envelope

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

...

Message information goes here

...

</soap:Envelope>

 

4.2  Header 元素

Header元素包含有关 SOAP 消息的应用程序专用信息,如果使用Header元素,那么Header元素肯定是根元素Envelope的第一个子元素。

SOAP 在默认的命名空间中 ("http://www.w3.org/2001/12/soap-envelope") 定义了三个属性。这三个属性是:actormustUnderstand 以及 encodingStyle。这些被定义在 SOAP 头部的属性可定义容器如何对 SOAP 消息进行处理。

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

actor属性:

Ø  作用:将 Header 元素寻址到一个特定的端点

Ø  语法:soap:actor="URI"

Ø  示例:

<?xml version="1.0"?>

<soap:Envelope

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

 

<soap:Header>

<m:Trans

xmlns:m="http://www.w3school.com.cn/transaction/"

soap:actor="http://www.w3school.com.cn/appml/">

234

</m:Trans>

</soap:Header>

 

...

...

 

</soap:Envelope>

 

mustUnderstand属性:

Ø  作用:用于标识标题项对于要对其进行处理的接收者来说是强制的还是可选的。

Ø  语法:soap:mustUnderstand="0|1",如果取1,则它可指示处理此头部的接收者必须认可此元素。假如此接收者无法认可此元素,则在处理此头部时必须失效。,

Ø  示例:

<?xml version="1.0"?>

<soap:Envelope

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

 

<soap:Header>

<m:Trans

xmlns:m="http://www.w3school.com.cn/transaction/"

soap:mustUnderstand="1">

234

</m:Trans>

</soap:Header>

 

...

...

 

</soap:Envelope>

 

encodingStyle 属性:

前面已介绍过

4.3  Body 元素

包含打算传送到消息最终端点的实际 SOAP 消息。

Body 元素的直接子元素可以是合格的命名空间

实例:

<?xml version="1.0"?>

<soap:Envelope

xmlns:soap="http://www.w3.org/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

 

<soap:Body>

   <m:GetPrice xmlns:m="http://www.w3school.com.cn/prices">

      <m:Item>Apples</m:Item>

   </m:GetPrice>

</soap:Body>

 

</soap:Envelope>

注:请注意,上面的 m:GetPrice Item 元素是应用程序专用的元素。它们并不是 SOAP 标准的一部分。

5.    SOAP绑定到HTTP

其实SOAP就是:HTTP + XML = SOAP

传统的访问文本格式网页的HTTP头是

POST /item HTTP/1.1

Host: 189.123.345.239

Content-Type: text/plain

Content-Length: 200

 

SOAP 请求可能是 HTTP POST HTTP GET 请求。

HTTP POST 请求规定至少两个 HTTP 头:Content-Type Content-Length

Ø  绑定语法:

n  Content-Type: MIMEType; charset=character-encoding

n  Content-Length: bytes

Ø  绑定实例:

POST /item HTTP/1.1

Content-Type: application/soap+xml; charset=utf-8

Content-Length: 250

 

6.    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/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/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/2001/12/soap-envelope"

soap:encodingStyle="http://www.w3.org/2001/12/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>