This is my study note of SOAP.

总体简介

介绍

soap是一种简单的基于XML的协议,可以使应用程序在分散式或者分布式的环境通过HTTP来交换信息。其组成部分包括:

  • SOAP信封
    1
    定义了一个框架,框架描述了消息中的内容是什么,包括内容、发送者、接收者、处理者以及如何处理消息。
  • SOAP编码规则
    1
    定义了一系列化的机制,用于交换应用程序所定义的数据类型的实例。
  • SOAP RPC表示
    1
    定义了远程调用和应答的协议。
  • SOAP绑定
    1
    定义了一种底层传输协议来完成结点间交换SOAP信封的协议。
    SOAP基本是从发送端到接收端的单向传输,类似请求/应答模式

特性

  • 轻量级
  • 用于应用程序间的通信
  • 使用SOAP的应用使用HTTP协议通信
  • SOAP独立于平台
  • SOAP基于xml
  • SOAP简单可扩展
  • SOAP可绕过防火强

SOAP消息组成

一条SOAP消息就是一个简单的XML文档,文档包括以下元素:

  • Envelope(信封),必选,可把XML消息标识为SOAP消息
  • Header(报头)元素,可选,包含头部信息
  • Body(主体),必选,包含所有的调用和响应信息
  • Fault元素,可选,提供有关处理此消息所发生错误的信息
  • Attachment,可选,添加一个或多个附件拓展SOAP消息

SOAP基本消息结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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>

SOAP Header元素

  • actor属性
    1
    沿着消息路径经过不同的断点,soap消息并不是全部消息都传输到最终的端点,actor属性用于寻址到特定的端点。
  • mustUnderstand属性
    1
    用于标识对进行处理的接收者来说是强制的还是可选的,1强制,0可选。
  • encodingStyle
    1
    定义使用的数据类型。

SOAP Fault元素

SOAP Fault必须包括以下子元素:

子元素 描述
faultcode 供识别故障的代码
faultstring 可供人阅读的有关故障的说明
faultactor 有关是谁引发故障的信息
detail 存留涉及Body元素的应用程序专用错误信息

下面这些faultcode值必须用于描述时faultcode中:

描述
VersionMismatch SOAP Envelope元素的无效命名空间被发现
Misundestand Header元素的一个直接子元素(带有设置为 “1” 的 mustUnderstand 属性)无法被理解。
Client 消息被不正确的构成,或者包含不正确的信息
Server 服务器有问题,因此无法处理进行下去

SOAP附件

SOAP实际上被分为两种类型:

  • 仅包含XML内容的消息
  • MIME编码的消息
    1
    SOAP规范规定SOAP消息可以包含XML格式的主SOAP信封,以及包含ASCLL或二进制等任何数据格式的SOAP附件。如果包含附件,则消息将是一个MIME编码消息。

消息绑定

style属性

  • RPC方式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    客户端/服务端方式,发送请求到服务器端,服务器执行完后返回结果,要使用RPC必须遵循几条规则:
    1.请求和响应消息必须被编码成结构类型
    2.对每一个操作的每一个参数都必须有一个同名元素做为参数
    3.对每一个输出参数都必须有一个名称匹配的参数
    RPC请求消息格式:

    <SOAP信封>

    <SOAP头部>

    ……

    </SOAP头部>

    <SOAP消息体>

    <请求操作名称>

    <参数名1>值</参数名1>

    <参数名2>值</参数名2>

    ......

    </请求操作名称>

    </SOAP消息体>

    </SOAP信封>

    RPC响应消息格式:

    <SOAP信封>

    <SOAP头部>

    ……

    </SOAP头部>

    <SOAP消息体>

    <响应操作名称>

    <参数名1>值</参数名1>

    <参数名2>值</参数名2>

    ......

    </响应操作名称>

    </SOAP消息体>

    </SOAP信封>
  • DOCUMENT方式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    与RPC相比,DOCUMENT方式在XML文件中不是做远程方法的映射,而是一个完整业务的文档,当服务器受到这份文档后,不再是进行简单的方法调用,而是多个对象协同完成一个事务的处理,再返回结果。采用DOCUMENT方式构造消息,SOAP Body元素中的内容完全由WSDL中的XML Schema定义。
    Document请求消息格式:

    <SOAP信封>

    <SOAP头部>

    ……

    </SOAP头部>

    <SOAP消息体>

    <输入消息>

    ….

    </输入消息>

    ….

    </SOAP消息体>

    </SOAP信封>

    Document响应消息格式:

    <SOAP信封>

    <SOAP头部>

    ……

    </SOAP头部>

    <SOAP消息体>

    <输出消息>

    ….

    </输出消息>

    ….

    </SOAP消息体>

    </SOAP信封>

use属性

  • Encode
    1
    取值为encoded时,设置encodingstyle属性的值指定编码规则。
  • literal
    1
    可以不用设置encodinstyle属性,默认使用XML Schema。