Web Services之SOAP
[toc]
什么是SOAP
SOAP(Simple Object Access Protocol)简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议,是一个基于XML的协议。
SOAP 协议包括以下四个部分:
1.SOAP封装(envelop),封装定义了一个描述消息中的内容是什么,是谁发送的,谁应当接受并处理它以及如何处理它们的框架;
2.SOAP编码规则(encoding rules),用于表示应用程序需要使用的数据类型的实例;
3.SOAP RPC表示(RPC representation),表示远程过程调用和应答的协定;
4.SOAP绑定(binding),使用底层协议交换信息。
SOAP的传输协议使用的就是HTTP协议。只不过HTTP传输的内容是HTML文本,而SOAP协议传输的是SOAP的数据。
语法规则
1.SOAP 消息必须用 XML 来编码;
2.SOAP 消息必须使用 SOAP Envelope 命名空间;
3.SOAP 消息必须使用 SOAP Encoding 命名空间;
4.SOAP 消息不能包含 DTD 引用;
5.SOAP 消息不能包含 XML 处理指令;
SOAP消息结构
一条 SOAP 消息就是一个普通的 XML 文档,包含如下元素:
1 必需的 Envelope 元素,据此可把该 XML 文档标识为一条 SOAP 消息;
2 可选的 Header 元素,包含头部信息,一般用于身份验证;
3 必需的 Body 元素,包含所有的调用和响应信息;
4 可选的 Fault 元素,提供有关在处理此消息时,所发生的错误的描述信息;
一条 SOAP 消息的基本格式:
<?xml version="1.0" encoding="utf-8"?> <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 Envelope
Envelope 是 SOAP 消息结构的主要容器,也是 SOAP 消息的根元素,它必须出现在每个 SOAP 消息中,用于把此 XML 文档标示为一条 SOAP 消息。
在 SOAP 中,使用命名空间将 SOAP 消息元素与应用程序自定义的元素区分开来,将 SOAP 消息元素的作用域限制在一个特定的区域。<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> </soap:Envelope>
SOAP 的 encodingStyle 属性用于定义在文档中使用的数据类型。此属性可出现在任何 SOAP 元素中,并会被应用到元素的内容及元素的所有子元素上。
SOAP Header
这个是可选的,如果需要添加 Header 元素,那么它必须是 Envelope 的第一个子元素。Header 还可以包含0个或多个可选的子元素,这些子元素称为 Header 项,所有的 Header 项一般来说是属于某个特定与接口相关的命名空间。<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Header> <AuthenHeader xmlns="http://www.example.com"> <sAuthenticate>string</sAuthenticate> </AuthenHeader> </soap:Header> <soap:Body> </soap:Body> </soap:Envelope>
Header 元素用于与消息一起传输一些附加的消息,如身份验证信息等。
SOAP Body
SOAP 消息的 Body 元素可以包含以下任何元素:
1 远程过程调用(RPC)的方法及其参数;
2 目标应用程序(消息接收者即接口调用者)所需要的数据;
3 报告故障和状态消息的 SOAP Fault;
所有 Body 元素的直接子元素都称为 Body 项,所有 Body 项一般是属于某个特点的命名空间的。
SOAP 请求消息例子:<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Body> <getMobileCodeInfo xmlns="http://www.example.com"> <mobileCode>string</mobileCode> <userID>string</userID> </getMobileCodeInfo> </soap:Body> </soap:Envelope>
SOAP 响应消息例子:<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"> <soap:Body> <getMobileCodeInfoResponse xmlns="http://www.example.com"> <getMobileCodeInfoResult>string</getMobileCodeInfoResult> </getMobileCodeInfoResponse> </soap:Body> </soap:Envelope>
注:以上例子表示通过手机号获取手机号归属地等信息。第一个例子是请求消息,第二个例子是它的响应消息。
SOAP Fault
位于Body内,可选,提供有关处理此消息所发生错误的信息。